web-dev-qa-db-ja.com

結合する必要があるかどうかを判断するためのcaseステートメント

私は現在、ある種の条件付き結合を実行したいと思っています。次の例を考えます。

SELECT  age, name
FROM    users
UNION
SELECT  25 AS age, 'Betty' AS name

'users'の数が> = 2の場合にのみ、2番目のステートメントを結合したいとします。それ以外の場合は、2つを結合しないでください。

要約すると、テーブルに2つ以上の値しかない場合は、テーブルに行を追加したいと思います。

9
BlueBird

あなたが使うことができます 醜いハック このようなものですが、私は ティムの答え の方が良いと思います:

SELECT  age, name
FROM    users
UNION ALL

SELECT 25 AS age, 'Betty' AS name
WHERE (SELECT COUNT(*) FROM users) > 1
11
Zohar Peled

ストアドプロシージャにある場合は、_If...Else_を使用できます。

_IF (SELECT COUNT(*) FROM users) < 2
 BEGIN
  SELECT  age, name
  FROM    users
  END
ELSE
  SELECT  age, name
  FROM    users
  UNION ALL
  SELECT  25 AS age, 'Betty' AS name
_

それ以外の場合は、次のようなことを試すことができます。

_SELECT  age, name
  FROM    users
  UNION ALL
  SELECT  TOP 1 25 AS age, 'Betty' AS name
  FROM users
  WHERE (SELECT COUNT(*) FROM users) >= 2
_

重複を排除したくないと思われるため、_UNION ALL_を使用したことに注意してください。

ここで遊んだ: http://sqlfiddle.com/#!6/a7540/2323/

編集:私の2番目のアプローチの代わりに、私は Zohar's を好みます。したがって、_If....Else_を使用できる場合は、テーブルなしでWHERE (SELECT COUNT(*) FROM users) > 1を使用することをお勧めします。

7
Tim Schmelter

次のようなものが機能するはずです。

SELECT  age, name
FROM    users

UNION ALL

SELECT age, name
FROM (SELECT  25 AS age, 'Betty' AS name) x
CROSS APPLY (SELECT COUNT(*) FROM users) y(cnt)
WHERE y.cnt >= 2

NULLテーブルのレコード数が2未満の場合、UNION ALLの2番目の部分はusersになります。

5
Giorgos Betsos
SELECT age
     , name
FROM   users

UNION

SELECT 25 As age
     , 'Betty' As name
WHERE  EXISTS (
         SELECT Count(*)
         FROM   users
         HAVING Count(*) >= 2
       )
;
1
gvee