我有一个场景,我必须检查一个变量的默认值,如果它必须有条件地检查表2的EXISTS部分,如果它没有默认值,我必须有条件地检查EXISTS部分表3
以下是示例代码: -
SELECT * FROM tbl1 WHERE EXISTS (SELECT CASE WHEN @boolVar = 0 THEN (SELECT 'X' FROM tbl2 WHERE tbl1.col1 = tbl2.col1) ELSE (SELECT 'X' FROM tbl3 where tbl1.col1 = tbl3.col1) END)
使用常量进行演示查询以进行测试: -
SELECT 1 WHERE EXISTS (SELECT CASE WHEN 1 = 0 THEN (SELECT 'X' WHERE 1=0)
ELSE (SELECT 'X' WHERE 1 = 2) END)
注意: - 上面的查询总是返回1,即使没有一个条件也是令人满意的。
我知道我们可以使用OR运算符以及我们如何实现它,但我真的想知道,如果两个表都没有满足其特定where子句的行,即使它返回Table1中的所有行
我尝试用常量值的演示查询解释相同的内容。
请帮忙。
答案 0 :(得分:4)
当您的查询找不到任何匹配的记录时,它基本上会执行:
SELECT 1 WHERE EXISTS (SELECT NULL)
由于包含空值的行仍然是一行,EXISTS
命令将返回true。
您可以添加条件来过滤掉空行:
SELECT * FROM tbl1 WHERE EXISTS (
SELECT 1 FROM (
SELECT
CASE WHEN @boolVar = 0 THEN (SELECT 'X' FROM tbl2 WHERE tbl1.col1 = tbl2.col1)
ELSE (SELECT 'X' FROM tbl3 where tbl1.col1 = tbl3.col1)
END AS Y
) Z
WHERE Y IS NOT NULL
)
答案 1 :(得分:0)
以下是另一种选择,以防万一:
SELECT *
FROM Table1
WHERE EXISTS (
SELECT 1
FROM Table2
WHERE @var = @defValue
AND ... /* other conditions as necessary */
UNION ALL
SELECT 1
FROM Table3
WHERE @var <> @defValue
AND ... /* other conditions as necessary */
);