我想检查列中是否存在该值而不是给该记录,否则给出其中包含NULL值的记录。
以下是示例查询,但由于语法不正确,因此对我不起作用。
SELECT *
FROM t_config_rule
WHERE rule = (
CASE
WHEN rule = 'IND'
THEN 'IND'
ELSE NULL
END)
答案 0 :(得分:2)
CASE
子句中的WHERE
表达式毫无意义,因为您可以使用简单的AND
和/或OR
来表达相同的内容。您的病情转化为:
WHERE rule = 'IND' OR rule = NULL
由于rule = NULL
永远不是真的(它必须是rule IS NULL
才能生效),条件基本上只是
WHERE rule = 'IND'
似乎你似乎想要一些完全不同的东西。你似乎想要寻找一个单一的记录。它应该是rule = 'IND'
的那个。如果该记录不存在,则需要使用rule IS NULL
的记录。
因此,选择两个记录,'IND'
和NULL
的记录,然后保留首选记录:
SELECT *
FROM t_config_rule
WHERE rule = 'IND' OR rule IS NULL
ORDER BY rule NULLS LAST
FETCH FIRST ROW ONLY;
FETCH FIRST子句仅在Oracle 12c中可用。对于旧版本,请使用:
SELECT *
FROM
(
SELECT *
FROM t_config_rule
WHERE rule = 'IND' OR rule IS NULL
ORDER BY rule NULLS LAST
)
WHERE ROWNUM = 1;
或使用ROW_NUMBER
对行进行编号并保留第一行:
SELECT *
FROM
(
SELECT r. *, ROW_NUMBER() OVER (ORDER BY rule NULLS LAST) AS rn
FROM t_config_rule r
WHERE rule = 'IND' OR rule IS NULL
)
WHERE rn = 1;
FETCH FIRST
和ROW_NUMBER
是标准SQL,而ROWNUM
仅限Oracle(甚至违反标准)。