![](/img/trans.png)
[英]MySQL query returns empty set in WHERE clause having Japanese characters
[英]MySQL subquery with multiple return values in WHERE clause returns empty set
在 WHERE 條件中使用子查詢時,查詢返回空集:
如果我這樣做:(1)
USE general_db;
SELECT * FROM general_db.master WHERE alert IN ('M1_001','G1_011');
+------+-------------+
| mkey | alert |
+------+-------------+
| 17 | G1_011 |
| 19 | M1_001 |
+------+--------+----+
(1) 按預期工作。
然后我做:(2)
SELECT DISTINCT TABLE_NAME AS 'alert' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='maintenance_db';
+-------------+
| alert |
+-------------+
| G1_011 |
| M1_001 |
+-------------+
(2) 按預期工作。
但是如果我使用第二個查詢 (2) 作為第一個 (1) 的子查詢: (3)
SELECT * FROM general_db.master WHERE alert IN (SELECT DISTINCT TABLE_NAME AS 'alert' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='maintenance_db');
Empty set (0,00 sec)
(3) 沒有按預期工作。 我認為它應該返回與(1)相同的結果。
我怎樣才能讓 (3) 的組合返回與 (1) 中相同的結果? 為什么這個查詢 (3) 不起作用?
更多信息:
您可能已經注意到, maintenance_db 中的表名可能包含在general_db內的master表中名為alert的列中。
這很奇怪。 我確信子查詢語法是正確的,這個查詢工作正常:
SELECT * FROM general_db.master WHERE alert IN (SELECT alert FROM general_db.master WHERE alert IN ('G1_011','M1_001'));
所以我認為這可能與查詢(2)有關。
這有效:
USE maintenance_db;
select * from M1_001;
select * from G1_011;
所以我猜這些名字是正確的。
謝謝
為什么要從 INFORMATION_SCHEMA.COLUMNS 而不是 INFORMATION_SCHEMA.TABLES 表中獲取表名!? 沒有用於按 COLUMNS 表中的列名過濾的地方!
關於什么:
SELECT *
FROM general_db.master
WHERE TRIM(alert) IN
(
SELECT UPPER(TABLE_NAME)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='maintenance_db'
)
也不要使用內部查詢,為什么不使用簡單的 JOIN 之類的
SELECT m.*
FROM general_db.master m
JOIN INFORMATION_SCHEMA.TABLES t ON (UPPER(t.table_name)=TRIM(m.alert) AND t.table_schema='maintenance_db')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.