SQLキーワードのように見えるSQL列名を処理する方法は?


226

私のコラムの1つはと呼ばれfromます。名前を変更しなかったので変更できません。SELECT from FROM TableNameSQL Serverの混乱を避けるために、何か特別な構文はありますか?


3
区切り識別子にはANSI SQLの二重引用符を使用します。SQL Serverを含むほとんどすべてのdbmsで動作します。つまり、単純に実行できるSELECT "from" FROM TableName、便利でポータブルなものです。
-jarlh

回答:


354

カラム名を括弧で囲み、from[from]にします。

select [from] from table;

以下を使用することもできます(複数のテーブルをクエリするときに役立ちます)。

select table.[from] from table;

10
約:select TableName.from from TableName; PS:MySQLで動作します
Fabricio PH

1
私は今朝これを試しましたが、MySQLのインストールでは機能しないようです。それはそれをオンにするパラメータまたは何かですか?
CodeChimp 2013年

@CodeChimp-バックティックを使用してみてください、stackoverflow.com / questions / 2901453 / … この質問/回答はMS SQL Serverに固有です。
tvanfosson 2013年

そうですが、@ FabricioPHはMySQLで機能していると述べています。ローカルのMySQLインストールでこれを試した後、私はGoogle検索からここに偶然現れました。SQLでこのようなものをエスケープする一般的なANSI SQLの方法があるかどうかを確認しようとしていました。現在SQL Server 2005を使用していますが、他の一部のアプリにもOracleが含まれています。SQL Serverから別のサーバーに移動するように指示された場合に、「機能する」ようにJava DAOをコーディングしたいと思います。
CodeChimp 2013年

@CodeChimp私は指なしで私に起こった回数を数えることができます。:)
tvanfosson 2013年

25

PostgreSQLの場合は、次のように名前を二重引用符で囲みます。

select "from" from "table";

注:PostgreSQLは内部的に、引用符で囲まれていないすべてのコマンドとパラメーターを自動的に小文字に変換します。これにより、コマンドと識別子の大文字と小文字が区別されなくなります。sEleCt * tAblEから; テーブルから選択*として解釈されます。。ただし、二重引用符内のパラメーターはそのまま使用されるため、大文字と小文字が区別されます。select * from "table"; 「*」選択します。2つの異なるテーブルから結果を取得します。


二重引用符は、MS SQLでも機能しますが、大文字と小文字は区別されません。引用された識別子は、AFAIKであり、ブラケットで区切られた識別子の同等の代替です。
Pダディ

二重引用符は、AmazonのAthenaで使用されているPresto SQLクエリエンジンでも機能します。
ハンフリーズ

21

あなたがそれをしている間-それを別のものとしてエイリアス化してください(あるいはもっと良いことに、ビューまたはSPを使用して古いダイレクトアクセスメソッドを非推奨にします)。

SELECT [from] AS TransferFrom -- Or something else more suitable
FROM TableName

14

これを行うには、次の2つの方法があります。

  1. 次のように逆引用符を使用します。

テーブル名から「から」を選択

  1. テーブル名で次のように言及できます:

SELECT TableName.from FROM TableName


ありがとう!これにより、列BYからプルしようとしたGoogleシートクエリが保存されました
Paul

1
おかげで、二重引用符と角括弧の構文はクライアント(MySQLWorkbench)では機能しませんでしたが、バックティックメソッドでは機能しました。
kingInTheNorth

10

あなたの質問はここでよく答えられているようですが、この件についてもう1つコメントを追加したいと思います。

データベースを設計する人は、予約されているキーワードをよく理解し、それらの使用を避ける必要があります。誰かがそれを使用しているのを発見したら、それを(丁寧に)知らせてください。ここのキーワードは予約語です。

詳しくは:

「予約済みキーワードをオブジェクト名として使用しないでください。以前のバージョンのSQL Serverからアップグレードされたデータベースには、以前のバージョンでは予約されていないが現在のバージョンのSQL Serverの予約語である単語を含む識別子が含まれている場合があります。名前を変更できるようになるまで、区切り識別子を使用してオブジェクトを作成します。」 http://msdn.microsoft.com/en-us/library/ms176027.aspx

そして

「データベースに予約済みキーワードに一致する名前が含まれている場合は、それらのオブジェクトを参照するときに区切り識別子を使用する必要があります。詳細については、識別子(DMX)を参照してください。」 http://msdn.microsoft.com/en-us/library/ms132178.aspx


2
データベースオブジェクトには常にブラケットを使用することをお勧めします。
2013年

8

SQL Serverを使用している場合は、列またはテーブル名を角かっこで囲むだけです。

select [select]
from [table]

5

Apache Drillでは、バッククォートを使用します:

select `from` from table;

3

私もこの問題に直面しました。そして、このための解決策は、[Column_Name]をこのようにクエリに入れることです。

string query= "Select [Name],[Email] from Person";

だからそれは完全にうまくいきます。


3

こんにちは、私は完全にANSI準拠のTeradataシステムで作業しています。このような列に名前を付けるには、二重引用符 ""を使用します。

たとえばtype、SQLの予約済みキーワードであり、引用符でtype囲まれた場合、ユーザー指定の名前として扱われます。

以下のコード例を参照してください。

CREATE TABLE alpha1
AS
(
SEL
product1
type_of_product AS "type"
FROM beta1
) WITH DATA
PRIMARY INDEX (product1)

--type is a SQL reserved keyword

TYPE

--see? now to retrieve the column you would use:

SEL "type" FROM alpha1

Teradataデータベースを備えたDBeaverでこれが機能することを確認しました。ありがとう!
ポール、

1

次のように、列名を角かっこで囲むことができます。

Select  [from] from < ur_tablename>

または

一時テーブルに入れて、好きなように使用します。
例:

Declare @temp_table table(temp_from varchar(max))

Insert into @temp_table
Select * from your_tablename

ここでは、your_tablenameに含まれる列が1つ(つまり、from)であると想定しています。


3
これは、それ[from]が唯一の列であることyour_tablenameを前提としています。
Andriy M

一時テーブルから何を得ますか?それは完全に役に立たないようで、質問とはまったく関係ありません。
rjmunro 2013

@rjmunro、いや、これは完全に役に立たないようではありません。SQLからテーブルキューブをクエリすると、[[合計]]のような列の名前が返される場合があります。つまり、名前自体に「[」と「]」が含まれています。このような列を取得するために[[Total]]および[Total]を使用することはできません。最も簡単な方法は、クエリの結果を一時テーブルに入れることです。
darlove

@darlove引用符は使えません"[Total]"か?または、それを回避する方法があるかもしれません[\[Total\]]
rjmunro

@rjmunro、これを少し実験した後、私は知らなかった別の方法を見つけました:QUOTED_IDENTIFIERをONに設定してから、話していることである二重引用符を使用できます。方法ですが、一時テーブルオプションを完全に破棄しません
darlove

1

名前がキーワードである列を更新しようとしたときに、同じ問題が発生しました。上記の解決策は私を助けませんでした。次のようにテーブルの名前を指定するだけで解決しました。

UPDATE `survey`
SET survey.values='yes,no'
WHERE (question='Did you agree?')


1

MySQLでは、逆引用符( `)を使用する代わりに、UIを使用して列名を変更できます。テーブルを右クリック>テーブルを変更> SQLキーワードを含む列名を編集>コミット

select [from] from <table>

注意として、上記はMySQLでは機能しません


1

ここでの答えと私自身の経験から判断すると。移植を計画している場合、唯一受け入れられる答えは、テーブル、列、またはその他の名前にSQLキーワードを使用しないことです。

これらすべての回答はさまざまなデータベースで機能しますが、明らかにANSIソリューションをサポートしていないものもたくさんあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.