Як використовувати оператор SQL Select із підзапитом IF EXISTS?


76

Як вибрати логічне значення з підзапиту за допомогою оператора IF EXISTS (SQL Server)?

Це має бути приблизно так:

SELECT 
  TABEL1.Id, 
  NewFiled = (IF EXISTS(SELECT Id FROM TABLE2 WHERE TABLE2.ID = TABEL1.ID) 
                 SELECT 'TRUE' 
              ELSE 
                 SELECT 'FALSE') 
FROM TABEL1

Відповіді:


128

Використання CASE:

SELECT 
  TABEL1.Id, 
  CASE WHEN EXISTS (SELECT Id FROM TABLE2 WHERE TABLE2.ID = TABLE1.ID)
       THEN 'TRUE' 
       ELSE 'FALSE'
  END AS NewFiled  
FROM TABLE1

Якщо TABLE2.IDУнікальний або Первинний ключ, Ви також можете використовувати це:

SELECT 
  TABEL1.Id, 
  CASE WHEN TABLE2.ID IS NOT NULL
       THEN 'TRUE' 
       ELSE 'FALSE'
  END AS NewFiled  
FROM TABLE1
  LEFT JOIN Table2
    ON TABLE2.ID = TABLE1.ID

18

Ви також можете використовувати ISNULL та оператор select, щоб отримати цей результат

SELECT
Table1.ID,
ISNULL((SELECT 'TRUE' FROM TABLE2 WHERE TABLE2.ID = TABEL1.ID),'FALSE') AS columName,
etc
FROM TABLE1

2
Я щойно помітив, що ви сказали, що хочете значення bool, можливо, краще вибрати 1/0, а не True / False
Purplegoldfish

8
SELECT Id, 'TRUE' AS NewFiled FROM TABEL1
INTERSECT
SELECT Id, 'TRUE' AS NewFiled FROM TABEL2
UNION
SELECT Id, 'FALSE' AS NewFiled FROM TABEL1
EXCEPT
SELECT Id, 'FALSE' AS NewFiled FROM TABEL2;

4
+1 для об'єднання INTERSECT, UNIONі EXCEPTв одному запиті!
ypercubeᵀᴹ

Мінус 1 за те саме - демонстрування з непотрібною складністю, яку було б набагато важче прочитати та підтримати.
Anon_unique

@Anon_unique lol для мене цей код надзвичайно простий, можливо тому, що я думаю, що на основі набору.
одного дня, коли

4

Використовуйте CASEтвердження і робіть це так:

SELECT 
    T1.Id [Id]
    ,CASE WHEN T2.Id IS NOT NULL THEN 'TRUE' ELSE 'FALSE' END [Has Foreign Key in T2]
FROM
    TABLE1 [T1]
    LEFT OUTER JOIN
        TABLE2 [T2]
        ON
        T2.Id = T1.Id
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.