Cách sử dụng câu lệnh SQL Select với truy vấn phụ IF EXISTS?


76

Làm cách nào để chọn giá trị Boolean từ truy vấn con với câu lệnh IF EXISTS (SQL Server)?

Nó phải là một cái gì đó như:

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

Câu trả lời:


128

Sử dụng 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

Nếu TABLE2.IDlà Khóa duy nhất hoặc Khóa chính, bạn cũng có thể sử dụng:

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

Bạn cũng có thể sử dụng ISNULL và một câu lệnh select để nhận được kết quả này

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

2
Tôi chỉ nhận thấy bạn nói bạn muốn bool giá trị, nó có thể tốt hơn để chọn 1/0 chứ không phải là 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 để kết hợp INTERSECT, UNIONEXCEPTtrong một truy vấn!
ypercubeᵀᴹ

Điểm trừ 1 cho điều tương tự - hiển thị với độ phức tạp không cần thiết sẽ khó đọc và bảo trì hơn nhiều.
Anon_unique

@Anon_unique lol đối với tôi mã này cực kỳ đơn giản, có lẽ vì tôi nghĩ được đặt dựa trên.
onedaywhen

4

Sử dụng một CASEcâu lệnh và thực hiện như sau:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.