含特殊列名的SELECT查询匹配存在数据却返回0结果问题
问题原因
- 核心错误是列名误用单引号包裹:SQL中单引号用于标识字符串常量,你现有查询的WHERE条件本质是判断
'"Name (xyz)"'这个固定字符串是否包含AB CD EF G,而非比对Name (xyz)列的实际值,条件永远不成立,自然返回0条结果。 - 其次,你需要的是精确匹配,用
LIKE加通配符属于不必要的模糊匹配写法,逻辑上也容易因为额外字符匹配不到结果。 - 额外注意:
table是SQL保留字,直接用作表名也会导致解析异常,需要同步转义。
解决办法
针对不同数据库的标识符转义规则,写法分别如下:
- MySQL 环境:使用反引号包裹带特殊字符、空格的列名和表名
SELECT * FROM `table` WHERE `Name (xyz)` = 'AB CD EF G';
如果确实有模糊匹配需求,将=替换为LIKE '%AB CD EF G%'即可。
- PostgreSQL、SQL Server 环境:使用双引号包裹带特殊字符、空格的列名和表名
SELECT * FROM "table" WHERE "Name (xyz)" = 'AB CD EF G';
- Oracle 环境:使用双引号包裹的同时,需保证列名、表名的大小写与建表时的定义完全一致
SELECT * FROM "table" WHERE "Name (xyz)" = 'AB CD EF G';
内容的提问来源于stack exchange,提问作者daniel stafford
相关产品推荐
相关产品推荐

