具有空值

时间:2018-02-01 08:54:43

标签: sql oracle case where-clause

我想检查列中是否存在该值而不是给该记录,否则给出其中包含NULL值的记录。

以下是示例查询,但由于语法不正确,因此对我不起作用。

SELECT *
FROM t_config_rule
WHERE rule = (
  CASE
    WHEN rule = 'IND'
    THEN 'IND'
    ELSE NULL
  END)

1 个答案:

答案 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 FIRSTROW_NUMBER是标准SQL,而ROWNUM仅限Oracle(甚至违反标准)。