选择查询中的MySQL Concat/Trim检查是否存在于另一个表中-What';我的代码怎么了?

选择查询中的MySQL Concat/Trim检查是否存在于另一个表中-What';我的代码怎么了?,mysql,sql,toad,Mysql,Sql,Toad,表格基础 +----+----------------+ | ID | ACCOUNT | +----+----------------+ | 1 | 100 | | 2 | 120 | | 3 | 193 | | 4 | 201 | | 5 | 213 | | 6 | 247 | | 7 | 304 |

表格基础

+----+----------------+
| ID | ACCOUNT        | 
+----+----------------+
|  1 |            100 | 
|  2 |            120 | 
|  3 |            193 | 
|  4 |            201 |
|  5 |            213 |
|  6 |            247 |
|  7 |            304 | 
+----+----------------+
表_变换

+----+----------------+
| ID | Account_Number |  
+----+----------------+
|  1 |            100 | 
|  2 |           9120 | 
|  3 |            193 |  
|  4 |           9201 | 
|  5 |           9213 | 
|  6 |            442 | 
|  7 |            589 |
+----+----------------+
ACCOUNT列中的所有条目前面都有多个空格,因此我使用TRIM()函数

我需要返回表_Base中所有未在表_Transform中的Account_Number中显示的帐户,同时考虑到某些帐户在表_Transform中显示为9。因此,应返回的帐户是

    247
    304
但是,在我的代码中,它忽略AND子句并返回那些出现在表_Transform中的前面有9的语句。我该修什么

    SELECT * FROM Table_Base
    WHERE ACCOUNT NOT IN
    (SELECT Account_Number FROM Table_Transform)
    AND CONCAT(9,TRIM(ACCOUNT)) NOT IN (SELECT Account_Number FROM Table_Transform);
我认为CONCAT查询有问题,因为我甚至无法让它在一行SELECT语句中独立工作(它仍然会错误返回)。

试试这个

SELECT *
FROM Table_Base
WHERE TRIM(ACCOUNT) NOT IN
(SELECT Account_Number FROM Table_Transform)
AND CAST(CONCAT('9',TRIM(ACCOUNT)) AS UNSIGNED) NOT IN (SELECT Account_Number FROM Table_Transform);
--编辑添加的
CAST
以确保--


直接等价。我会使用
JOIN
语句,如果您感兴趣

我建议
不存在
。一种方法是:

SELECT b.*
FROM Table_Base b
WHERE NOT EXISTS (SELECT 1
                  FROM Table_Transform t
                  WHERE t.Account_Number = trim(b.account) OR
                        t.Account_Number = concat(9, trim(b.account)
                 );
但是,出于性能原因,我将其分为两个表达式:

SELECT b.*
FROM Table_Base b
WHERE NOT EXISTS (SELECT 1
                  FROM Table_Transform t
                  WHERE t.Account_Number = trim(b.account)

                 ) AND
      NOT EXISTS (SELECT 1
                  FROM Table_Transform t
                  WHERE t.Account_Number = concat(9, trim(b.account))
                 );
这可以利用
表转换(帐号)
上的索引