web-dev-qa-db-ja.com

SQL Serverでのエイリアスの角括弧と単一引用符の違いは何ですか?

私は一部の人々が一重引用符を使用して列名にエイリアスを付けるのを見ました:例:

select orderID 'Order No' from orders

他の人は角括弧を使用します。例:

select orderID [Order No] from orders

角括弧を使用する傾向があります。好み/違いはありますか?

25
Free2Rhyme2k

「好み/違いはありますか」という質問に答えるには:

はい、意見の数だけ好みがありますが、誰の好みを採用するかに注意してください。

ベストプラクティスとして、余分な労力を必要としない場合は、移植可能なSQLを作成することをお勧めします。

特定のサンプルについては、移植可能なクエリを記述するのと同じくらい簡単です。

select OrderId as "Order Id" from Orders

ポータブルでないものを書くより:

select OrderId as [Order Id] from Orders

同じ数のキーストロークの同等の移植可能な形式がある場合、非標準SQLを記述することは正当化されません。

エスケープのための[]の急増は、すべてを遅延してエスケープするSQL Server Management StudioやMS Accessクエリビルダーなどのツールが原因です。 SQL Serverでのキャリアを費やしている開発者には決して起こりえないかもしれませんが、ブラケットは長年にわたってAccessとSQL Serverアプリを他のデータベースプラットフォームに移植するのに多大な費用をかけています。すべてを引用するOracleツールについても同様です。訓練を受けていない開発者は、DDLを例として見て、手作業で書くときに同じスタイルを使用します。ツールが改善されて私たちがより良いものを要求するようになるまで、それを壊すのは難しいサイクルです。 Oracleでは、引用と混合ケーシングを組み合わせると、大文字と小文字が区別されるデータベースになります。私は、データベース内のすべての識別子を引用するプロジェクトを見てきました。私は、開発者がドキュメントやベストプラクティスの記事なしに島で進化したThe Lost of the Lostにいるような気がしました。

DDLを最初から正規化された有効な識別子([Order Id]ではなくOrderId、またはorder_Idを使用)で記述した場合、エスケープ文字が必要になる可能性がある神話的なキーワードについて心配する必要はありません。データベースから通知されます。予約語を使用しました。SQLServerのあるバージョンから別のバージョンにアプリをアップグレードしたことがあり、new予約語による破損があった回数を1本の指で数えることができます。

多くの場合、これは白熱した討論の主題なので、別の方法で考えると、次のようになります。

C#のプログラマーは、合法であってもすべての変数を@でエスケープしません。これは奇妙な方法と考えられ、StackOverflowのあざけりの対象になります。エスケープはEdgeの場合に必要です。しかし、準拠するC#識別子を作成する同じ開発者は、SQLのすべての識別子をエスケープして、ひどく醜く、移植できないSQL "コード"を作成することを気にしません。コンサルタントとして、[]が必要な構文であると正直に思っていた複数のSQL Serverプログラマーに会いました。開発者のせいではなく、ツールのせいです。

63
codenheim

'sが有効かどうかは、有効になっている設定によって異なります。そして、あなたは"を逃しました。 区切り識別子 を参照してください:

QUOTED_IDENTIFIERがONに設定されている場合、SQL Serverは、SQLステートメントでの二重引用符( ")および単一引用符( ')の使用に関するISO規則に従います。次に例を示します。

  • 二重引用符は、識別子を区切るためにのみ使用できます。文字列を区切るために使用することはできません。

  • 文字ストリングを囲むには、単一引用符を使用する必要があります。識別子の区切りに使用することはできません。


QUOTED_IDENTIFIERがOFFに設定されている場合、SQL Serverは一重引用符と二重引用符に次の規則を使用します。

  • 引用符を使用して識別子を区切ることはできません。代わりに、大括弧を区切り文字として使用する必要があります。

  • 文字ストリングを囲むには、単一引用符または二重引用符を使用できます。

そして最後に:

括弧内の区切り文字は、QUOTED_IDENTIFIERの設定に関係なく、常に使用できます

上記のすべての引用で、括弧を参照する場合、それらは[]括弧について話している。

単一引用符はより読みやすくなっています。上記のように、赤で強調表示されています。

MySQLは特殊文字をエスケープするために「バックティック」を使用します。

MSSQLは、識別子(テーブル、列など)に「二重引用符」または[ブラケット]を使用できます。
および文字列またはエイリアスの「一重引用符」。

角括弧は、スペース、ピリオド、ハイフンなどの特殊文字が構文エラーをスローしないように、主にオブジェクトをカプセル化するために使用されます。

列のエイリアスの前に「as」キーワードを使用することをお勧めします-ずっと読みやすくなります。

select [column with spaces] as 'my col' from "table with spaces" where n = 'foo'
select "column with spaces" as 'my col' from [table with spaces] where n = 'foo'
4
Mike Causer

見積もりアプローチでは、これを行うことができます。

SELECT 1 AS 'bla[]bla'
2
Wietze314