0

これら 2 つのクエリの違いについてお聞きしたいです。

select ProductName = case when p.ProductID is null then 'Unknown' else p.ProductName end

select p.ProductName = case when p.ProductID is null then 'Unknown' else p.ProductName end

(p は表 Product のエイリアスです)

SQL Server Management Studio 2008 R2 での違いは何ですか? 1回目は問題なく実行できましたが、2回目は「=」付近の構文が正しくありません。

誰でもこれについて説明できますか?ありがとう。

4

1 に答える 1

1

最初のケースProductNameではテーブル列ではなく、エイリアスです。次のように考えてください。

select case when p.ProductID is null then 'Unknown' else p.ProductName end as ProductName

2 番目の不適切なクエリでは、テーブルから列を選択し、式から生成しているエイリアスであるかのように割り当てようとしているため、不正なことをしようとしています。

あなたの混乱はProductName、そのテーブルにその名前の列があるため、常に列であると考えていることだと思いますが、このコンテキストでは列名でProductNameはありません。これは、case ステートメントの結果のエイリアスです。そのため、SQL エンジンにテーブルから列p.ProductNameを選択するように指示し、それがエイリアスであるかのように case ステートメントを割り当てようとします (これはコンテキストにありません)。ProductNamepp.ProductName

case ステートメントはエイリアスであるため、任意の名前を簡単に使用できます。あなたができる:

select DerivedProductName = case when p.ProductID is null then 'Unknown' else p.ProductName end

この例は、この構文を使用するときに列名を扱っていないことをより明確にしていますか?

于 2013-11-09T16:54:33.230 に答える