差異

2013-11-09 100 views
0

我想請教一下這兩個查詢之間的區別:差異

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爲表產品的別名)

它們在sql server management studio 2008 R2中有什麼區別?當我執行第一個代碼時,它被成功執行了,但是對於第二個代碼,我收到了錯誤消息「不正確的語法靠近'='。」

任何人都可以向我解釋這件事嗎?謝謝。

回答

1

第一種情況ProductName不是表列,它是別名。認爲它是這樣的:

select case when p.ProductID is null then 'Unknown' else p.ProductName end as ProductName 
你正在嘗試做違法的事,因爲你試圖同時第二個不正確的查詢

從表中選擇一列,並分配給它,如果它是你正在生成的別名從一個表達。

我覺得你的困惑是,你認爲ProductName始終是一個列,因爲是在表名稱的列,但在這種情況下ProductName列名;它是一個別名的案例結果。因此當您嘗試p.ProductName時,您要告訴SQL引擎從p表中選擇ProductName列,然後嘗試將case語句分配爲別名(它不在p.ProductName上下文中)。

您可以輕鬆地使用任何名稱作爲case語句,因爲它是一個別名。你可以這樣做:

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

沒有這個例子更清楚,你是不是有列名打交道時使用此語法?

+0

那麼,這個怎麼樣? SELECT ProductNumber,Category = CASE ProductLine WHEN'R'THEN'Road' ELSE'Not for sale' END,FROM ... 它與我的第二個查詢格式相同,不是嗎?它也爲它選擇並賦值。我從微軟網站上獲取了這個查詢。 – SQLnubie

+0

@SQLnubie不,它與您的破解查詢不一樣。如果將'Category ='更改爲'something.Category =',則會出現錯誤。如果您需要進一步澄清,請更新您的問題。 –

+0

哦,我的意思是'類別'在這裏也是一個專欄?並且它也會爲我的第二個查詢選擇一個值並將其分配給「類別」列。如果我錯了,請糾正我,因爲我仍然有點困惑。 – SQLnubie