查询table.column不替换另一个表的更改列的位置

时间:2017-11-20 17:38:17

标签: mysql sql

我确定答案正盯着我,但我无法弄明白。我有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"查询工作?

1 个答案:

答案 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(不是真的)。所以你没有行。