我正在尝试学习如何使用CASE/何时使用SQL,更具体地说,mySQL。
我有两个表:临时项目和临时漏洞。ahdoc_项有一个与之相关的临时漏洞。现在,临时漏洞可能附加了漏洞(原始漏洞id),也可能没有附加该漏洞。
如果没有,那么我想把名字放回原处。
表格:(或其有关部分)
临时项目
临时漏洞
这是我的问题:

SELECT adi.name as item, CASE ahv.original_vulnerability_id
WHEN ISNULL(ahv.original_vulnerability_id) THEN ahv.name
ELSE 'foo'
END NAME
FROM adhoc_item adi
JOIN adhoc_vulnerability ahv ON ahv.id = adi.adhoc_vulnerability_id

这些就是结果!
现在我知道这有点复杂,但我已经考虑了大约2个小时,没有找到解释为什么最后一个项目(它有一个临时的漏洞,空为原始的漏洞)显示的值应该出现在属性不是空!
提前谢谢。

最佳答案

问题是当ahv.original_vulnerability_idNULL时,ISNULL()函数返回TRUE(MySQL与1相同,但这不相关)。因此,与其将列与NULL进行比较,不如将其与TRUE进行比较。
将表达式重写为:

CASE
WHEN ISNULL(ahv.original_vulnerability_id) THEN ahv.name
ELSE 'foo'
END NAME

或作为:
CASE
WHEN ahv.original_vulnerability_id IS NULL THEN ahv.name
ELSE 'foo'
END NAME

10-07 15:15