2017-07-02 21 views
0

この単純な問合せで結果が返されない場合(NULL)、1行にゼロが戻されます。いくつかの結果がある場合、クエリはエラー512を返します。nullでない場合のSQL戻り値nullの場合はゼロを返します。

値が見つかった場合はそれを変更し、そうでない場合は「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

これは、式としてサブクラスを使用しているため、複数の値を返すことができないためです。 –

答えて

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の2番目のクエリは、結果が返されなかった場合にのみ0を返します。それ以外の場合は、結果を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); 
関連する問題