我正在尝试将LEFT JOIN
aCHAR
转换为INT
. 像这样:
SELECT o.title, d.title FROM original o
LEFT JOIN directory d ON CONVERT(o.directory_index, UNSIGNED INT) = d.index
如果索引大于零,这会给我正确的响应。但是,如果索引为零或空字符串,我会为每个目录标题获得重复的行:
o.title (o.index) d.title (d.index)
"Big Boss" "2" "OUTER HEAVEN" 2
"Snake" "0" "FOX" 0
"Snake" "0" "FOXHOUND" 1
"Snake" "0" "OUTER HEAVEN" 2
"Kerotan" "" "FOX" 0
"Kerotan" "" "FOXHOUND" 1
"Kerotan" "" "OUTER HEAVEN" 2
所以我添加了一个COALESCE
语句来将每个空字符串转换为一个NULL
值:
SELECT o.title, d.title FROM original o
LEFT JOIN directory d ON CONVERT(
CASE WHEN COALESCE(o.directory_index, '') = '' THEN NULL ELSE o.directory_index END,
UNSIGNED INT
) = d.index
该COALESCE
语句确实给了我正确的响应(我单独测试了函数的输出),但现在我得到NULL
了每个目录标题,除非索引设置为0
,在这种情况下,我得到与以前相同的结果:
o.title (o.index) d.title (d.index)
"Big Boss" "2" NULL 2
"Snake" "0" "FOX" 0
"Snake" "0" "FOXHOUND" 1
"Snake" "0" "OUTER HEAVEN" 2
"Kerotan" "" NULL 0
"Kerotan" "" NULL 1
"Kerotan" "" NULL 2
我究竟做错了什么?
正如建议的那样,我删除了该COALESCE
声明,并将其换成了一个NULLIF
声明:
SELECT o.title, d.title FROM original o
LEFT JOIN directory d ON CONVERT(
NULLIF(o.directory_index, ''),
UNSIGNED INT
) = d.index
但我遇到的结果与我有COALESCE
声明一样。
我创建了我提供的示例的小提琴,奇怪的是它给了我想要的结果。但这不是我在 Workbench 中得到的结果。服务器正在运行旧版本的 MySQL(我认为是 5.1?)这可能是问题吗?
好吧……所以我很尴尬。我昨天一整天都在用头撞墙。然后我今天早上进来看看它,原来应该LEFT JOIN ... ON ... = d.index
设置为LEFT JOIN ... ON ... = d.title
。我将在这个线程上投票给每个人。但我希望你们都对我投反对票和/或将问题标记为关闭。