2016-07-07 51 views
1

我有一個數據庫表「table_name1」在SQL Server 2012中,我使用SQL Server Management Studio版本10.如何運行SQL查詢以從三列之一中提取數據?

數據表的樣子:

colpkey col1 col2 col3 
1234 AB1234 AB1234 
1265 BS5379 BS5379 BS5379 
2323 WE7865 WE7865 WE7865 
3267   WB7690 WB7690 
6543 NULL DH6583 
8798     NULL 
9403 BF6543   NULL 
9856 BH7548 BH7548 BH7548 

查詢我用來創建該表樣本表:

create table table_name1 (
    colpkey bigint primary key, 
    col1 varchar(10) , 
    col2 varchar(10), 
    col3 varchar(10) 
); 

我想寫一個查詢,所以它應該拉兩欄,「colpkey」和「col」。 「col」應該來自「col1」的值。如果「col1」爲NULL或空白,則應從「col2」中獲取值。如果「col2」爲NULL或空白,則應從「col3」中獲取值。如果所有「col1」,「col2」和「col3」都是空白或NULL,那麼放入「col」的值應該是空白('')。

所以對於給定的樣本「table_name1」查詢應拉像數據:

colpkey col 
1234 AB1234 
1265 BS5379 
2323 WE7865 
3267 WB7690 
6543 DH6583 
8798  
9403 BF6543 
9856 BH7548 

我怎麼能寫查詢做到這一點?我試圖用例,並與下面的查詢上來:

select colpkey, 
Case WHEN (col1 != null and col1!= '') then col1 
    ELSE 
    (CASE WHEN (col2 != null and col2!= '') then col2 
    ELSE 
    (CASE WHEN (col3 != null and col3!= '') then col3 
    ELSE '' END) END) END as col 
from table_name1; 

但它顯示空白的每一行,如:

colpkey col 
1234  
1265  
2323  
3267  
6543  
8798  
9403  
9856  

請建議我在哪裏與查詢回事?

回答

2

我喜歡使用了SQL Server的專有isnull標準SQL​​3210功能查找非空值,我們也可以使用nullif滿足「空白」的要求:

select colpkey, coalesce(nullif(col1, ''), nullif(col2, ''), nullif(col3, ''), '') as col 
from table_name1; 

UPDATE:

要回答「我在哪裏出錯了查詢?」正如@ToddVrba所提到的那樣,您不應該使用標準比較運算符(如equals,less-than等)將其與null進行比較。它有助於將關係數據庫中的空值視爲「未知」,這意味着將已知值與未知值進行比較總是會產生未知值或爲空值。您應該使用is nullis not null與空比較。

此外,您的案例陳述過於複雜;你只需要一個case語句,如:

​​3210

雖然我找到了結合並NULLIF組合更簡潔,但同樣可讀。

+0

你快了;) –

+0

@AlexKudryashev GMTA。 –

+0

謝謝Tim的建議。它給了我我期待的結果。所以我已經接受了你的回答。 – 300

5

在SQL中,您無法將NULL!=進行比較。你必須做IS NOT NULL

相關問題