2017-07-02 233 views
0

如果此簡單查詢返回無結果(NULL),則它在一行中返回零,這是正確的。如果有一些結果,查詢返回錯誤512.SQL返回值如果不爲空,則返回零,如果爲空

如何修改它返回值,如果找到和「0」,如果不是?

select ISNULL((select Name from NAMES 
left join ADDRESS on NAMES.Name = ADDRESS.Person 
where 
NAMES.Name = myinput 
) , 0) as Name 
+0

嘗試更換一個號碼'0'用字符串''0''。 – krokodilko

+0

如果有多個名稱沒有匹配的地址,應該返回什麼?如果某些名稱具有匹配的地址並且某些名稱不匹配,應該返回什麼? – kirodge

+0

這是因爲您使用子查詢作爲表達式,因此不允許返回多個值嘗試使用IIF代替 –

回答

1

好吧,如果你的內部查詢返回不止一個值,你應該得到一個錯誤,因爲isnull只能處理一個值。 我建議使用不同的方法。該代碼是長,但它會給你用任意數量的查詢返回的行正確的結果:

;WITH CTE AS 
(
    SELECT Name 
    FROM NAMES 
    LEFT JOIN ADDRESS ON NAMES.Name = ADDRESS.Person 
    WHERE NAMES.Name = @myinput 
) 

SELECT Name 
FROM CTE 
UNION ALL 
SELECT '0' 
WHERE NOT EXISTS(SELECT 1 FROM CTE) 

使用你的內部查詢的CTE讓我把它寫一次。
使用NOT EXISTS會導致union中的第二個查詢僅返回0,此時cte不返回任何結果。否則,你會得到cte的結果。

1

裹主查詢到CTE現在

with q as(
    select Name 
    from NAMES 
    left join ADDRESS on NAMES.Name = ADDRESS.Person 
    where 
    NAMES.Name = myinput 
) 
select Name 
from q 
union all 
select '0' 
where not exists(select 1 from q); 
相關問題