1

次のようなクエリを作成する必要があります。

SELECT attr
FROM SomeTable B
WHERE EXISTS
    (CASE WHEN B.some_attr = 0
        THEN (SELECT x FROM C WHERE Bz = z)
     WHEN B.some_attr = 1
        THEN (SELECT x FROM D WHERE Bz = x)
     END)

しかし、SQL Server はこれを実行することを拒否し、構文エラーを引き起こします。
このクエリを変更して機能させるにはどうすればよいですか?

編集:エラーを追加しています:

メッセージ 156、レベル 15、状態 1、行 4 キーワード「CASE」付近の構文が正しくありません。
メッセージ 156、レベル 15、状態 1、行 6 キーワード「WHEN」付近の構文が正しくありません。
メッセージ 102、レベル 15、状態 1、行 8 ')' 付近の構文が正しくありません。

4

3 に答える 3

2

これを試して:

SELECT A 
FROM B 
WHERE 
     CASE 
     WHEN B.some_attr = 0 AND EXISTS(SELECT x FROM C WHERE B.z = z) THEN 1
     WHEN B.some_attr = 1 AND EXISTS(SELECT x FROM D WHERE B.z = x) THEN 1
     END = 1
于 2012-07-20T14:07:15.020 に答える
1

これを試して:

SELECT A
FROM B
WHERE 
    (CASE WHEN B.some_attr = 0
          THEN (SELECT x FROM C WHERE B.z = z)
          WHEN B.some_attr = 1
          THEN (SELECT x FROM D WHERE B.z = x)
     END) is not null

これは、サブクエリが 1 行を返すことを前提としています。そうでない場合は、x ではなく max(x) を入力してください。

于 2012-07-20T14:04:48.407 に答える
1

これもうまくいくはずだと思います:

SELECT attr 
FROM SomeTable B 
WHERE EXISTS (
    SELECT 1 FROM C WHERE B.some_attr = 0 AND B.z = z UNION ALL
    SELECT 1 FROM D WHERE B.some_attr = 1 AND B.z = x
)
于 2012-07-20T14:08:24.803 に答える