我有三张桌子。第一个表包含所有记录以及其他数据(区域,日期等)的列表。第2和第3个表包含所有小时/费用数据,但第2个表仅包含历史记录,第3个表包含较新的记录。我希望我的coalesce首先尝试在较新的记录中找到一个值,但如果没有找到记录,则查看历史表。出于某种原因,即使我知道历史表中有一个值,我的合并结果也是0。
Table1
ID Region
1 US
2 US
3 Europe
4 US
5 Europe
6 US
Table2
ID Hours
1 10
2 15
3 20
Table3
ID Hours
4 3
5 7
6 4
所以,我的陈述是这样写的:
SELECT
t1.ID,
COALESCE(t3.hours, t2.hours) AS HOURS
FROM table1 t1
LEFT JOIN table2 t2
ON t1.ID=t2.ID
LEFT JOIN table3 t3
ON t1.ID=t3.ID
现在,由于某种原因,如果在t3(较新的记录)中找到该值,则它会输入正确的值,但如果它没有找到值并且必须从t2中提取值,则它会拉入a 0而不是实际值。结果如下所示:
ID HOURS
1 0
2 0
3 0
4 3
5 7
6 4
我的猜测是它与表2中的列类型有关(我将所有列设置为VARCHAR(55),但我在coalesce函数中找不到任何关于数据类型的规则只能使用具有合并的某种列类型。
感谢任何指导!
编辑为Spencer的查询添加结果:
ID t2.hours + 0 t2.hours hex(t2.hours) length(t2.hours)
413190 240 240 F0 3
答案 0 :(得分:2)
连接不正确:
FROM table1 t1
LEFT JOIN table2 t2 ON t1.ID=t2.ID
^
LEFT JOIN table3 t3 ON t1.ID=t2.ID
^
您使用表2中的值
加入表3答案 1 :(得分:0)
t2.hours
函数中的COALESCE
评估似乎是在 numeric 上下文中完成的,而hours
列中存储的值正在评估中到数值0
。
检查评估数字的一种快速方法是添加零,如此查询中的第一个表达式:
SELECT t2.hours + 0
, t2.hours
, HEX(t2.hours)
, LENGTH(t2.hours)
FROM table2 t2
我很好奇该查询显示的是从COALESCE表达式返回0
的行之一,数值评估是否返回0,以及列值中是否存在任何前导不明确的字符。< / p>