2

Select ステートメントで case ステートメントを使用している SQL Server 2005 クエリがあります。それを行う「正しい」方法が何であるかを知りたいです。

各フォーマットは完全に正常に動作しているようですが、異なる選択または何かの間に冗長性があるかどうか疑問に思っていました.

サンプル形式:

SELECT 'isItemDisplayed' = CASE WHEN ... THEN ... END FROM myTable

SELECT isItemDisplayed = CASE WHEN ... THEN ... END FROM myTable

SELECT CASE WHEN ... THEN ... END AS isItemDisplayed FROM myTable

SELECT CASE WHEN ... THEN ... END AS 'isItemDisplayed' FROM myTable

SELECT CASE WHEN ... THEN ... END isItemDisplayed FROM myTable
4

4 に答える 4

2

これは、CASE ステートメントとはまったく関係ありません。単純な列名 (つまり、クライアント コードに一致するように名前を変更する)、リテラル式、関数呼び出しなどを含む、選択リスト内の任意の式の列エイリアスを作成できます。ただし、CASE の例を続けると、いくつかのことがあります。知ること。

このように表示されることはほとんどありませんが、ANSI Sql 標準では、次のように名前に二重引用符を使用するように指示されています。

SELECT CASE WHEN ... THEN ... END "isItemDisplayed" FROM myTable

私がよく目にするのは、以下に示す、元の質問の 3 番目または 5 番目のオプションです。どちらでも構いません:

SELECT CASE WHEN ... THEN ... END As isItemDisplayed FROM myTable

SELECT CASE WHEN ... THEN ... END isItemDisplayed FROM myTable

[]これらのいずれでも、予約語と競合する名前やスペースを使用する名前が必要な場合は、名前を角かっこ ( ) で囲むこともできます。=ブール値の結果を探していると誰かを混乱させる可能性があるため、この構文を使用するものは避けます。ここで私ができるもう 1 つのアドバイスは、スタイルを 1 つ選んで、現在の環境でそれを使い続けることです。一貫性!

于 2013-10-15T19:38:07.680 に答える
0

あなたの質問は、ANSI SQL 標準と、Microsoft の実装における特殊性に関するものだと思います。

最初、1 番目 = 2 番目のステートメント、3 番目 = 4 番目 = 5 番目ですが、比較すると 1 番目 != 3 番目、3-5 は値を返します - 更新: MS SQL の場合、これらのクエリはすべて同じですが、他の DB の場合は同じです。異なる場合があります

とにかく、あなたの質問を次の 2 つの質問だけに単純化できます。

識別子をエスケープする適切な方法は何ですか

予約語と混合できない識別子を使用する場合 - 特別な記号で囲む必要はありませんが、よくわからない場合はそれらを使用することをお勧めします

標準 SQL は"記号を識別子の区切り記号として定義しますが、MS SQL は追加のもの ([] など) をサポートしているため、それらのどれでも使用できますが、推奨されます。http://en.wikibooks.org/wiki/SQL_Dialects_Reference/Data_structure_definition/"を確認してください。 Delimited_identifiers

使うべきASかどうか

キーワードASは SQL 標準ではオプションであり、MS 実装ではオプションですが、これはすべての DBMS に当てはまるわけではありません

チェックhttp://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt - キーワード [ AS ] - このドキュメントではオプションを意味します

最後に答えてください:

クエリが常に期待どおりに機能することを確認するには、エスケープを使用して AS キーワードを使用します。これは、別の DB の場合、または MS SQL の新しいバージョンで互換性のない変更が導入される場合に役立ちます。

したがって、このクエリの方が優れています。

SELECT CASE WHEN ... THEN ... END AS "isItemDisplayed" FROM "myTable"

于 2013-10-15T19:42:39.253 に答える
0

私はこれが好ましいものだと思います:-

SELECT CASE WHEN ... THEN ... END AS isItemDisplayed FROM myTable

最初の 2 つは、CASE ステートメントの結果を名前と比較するために使用されます。最後に、ALIAS として割り当てている結果です。

このリンクが興味深いことがわかりました(コメントでLamakが言及したように):

個人的には、エイリアスを一重引用符で囲むと気が散ってしまい、どのエイリアス規則を使用しても選択リストが読みにくくなります。エイリアス名はすべて文字列です。データであることを意図しているように見せたいのはなぜですか?また、#5 と #6 はどの標準でも定義されていないことに注意してください。構文に許可されているようです。

于 2013-10-15T19:26:25.887 に答える