1

我正在尝试学习如何在SQL中更具体地使用CASE/WHEN,mySQL。

我有两个表:adhoc_itemadhoc_vulnerabilityahdoc_item有一个与之相关的adhoc_vulnerability 。现在adhoc_vulnerability 可能有也可能没有附加的漏洞(original_vulnerability_id)。

如果没有,那么我想自己返回名称

表格:(或其相关部分)

ADHOC_ITEM 在此处输入图像描述

ADHOC_VULNERABILITY 在此处输入图像描述 这是我的查询:

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 个小时,并没有找到解释为什么最后一个项目(它有一个adhoc_vulnerability与 NULL 作为original_vulnerability_id)显示应该在什么时候精确出现的值该属性为空!

提前致谢。

4

1 回答 1

4

问题是当ahv.original_vulnerability_idis时NULLISNULL()函数返回TRUE(与 MySQL 相同,1但这无关紧要)。因此,不是将列与 进行比较,而是NULL将其与 进行比较TRUE


将表达式重写CASE为:

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
于 2012-11-01T21:31:50.500 回答