我确定答案正盯着我,但我无法弄明白。我有2个具有相同编号的表,在一个表中只有数字,在另一个表中随机散布的所有(是的,垃圾进入)。我试图查询一个忽略破折号的值不在另一个表中的地方。我可以让它为IN工作,但它不适用于NOT IN。我在这里做错了什么?
此查询与以下相同但使用IN代替NOT IN,可以工作:
SELECT * FROM table_a
WHERE reference_number IN (SELECT replace(reference_number_messy,'-','')
FROM table_b)
这个查询,与上面的查询相同但是使用NOT IN而不是IN,我认为会在table_a中返回all而不是上面的查询,但事实并非如此。相反,它不会返回任何结果:
SELECT * FROM table_a
WHERE reference_number NOT IN (SELECT replace(reference_number_messy,'-','')
FROM table_b)
我做错了什么?我怎样才能得到第二个" NOT IN"查询工作?
答案 0 :(得分:1)
您可能在子查询中有NULL
个值。你可以使用COALESCE
来避免它:
SELECT *
FROM table_a
WHERE reference_number NOT IN (
SELECT COALESCE(replace(reference_number_messy,'-','') ,'')
FROM table_b);
或过滤掉它:
SELECT *
FROM table_a
WHERE reference_number NOT IN (
SELECT replace(reference_number_messy,'-','')
FROM table_b
WHERE reference_number_messy IS NOT NULL);
说明:
x IN (y, z) <=> x = y OR x = z
x NOT IN (y,z) <=> x != y AND x != z
将任何内容与NULL
进行比较将产生UNKNOWN
(不是真的)。所以你没有行。