选择查询中的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))
);
这可以利用表转换(帐号)
上的索引