0

我有一个场景,我必须检查一个变量的默认值,如果它有我必须使用 Table2 有条件地检查 EXISTS 部分,如果它没有默认值,我必须使用 Table3 有条件地检查 EXISTS 部分。

以下是示例代码:-

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 中的所有行。

我试图用常量值的演示查询来解释相同的内容。

请帮忙。

4

2 回答 2

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
)
于 2012-09-03T09:24:41.177 回答
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 */
);
于 2012-09-03T15:42:07.680 回答