PostgreSQL中VARCHAR类型值比对查询返回空结果求助
解决字符串匹配返回空的问题
首先得说,你的两个查询逻辑本身是没问题的,=运算符完全适用于字符串类型的匹配——问题大概率出在字符串的隐形差异上,肉眼很难发现那种。结合你的示例数据,最常见的原因有这两个:
1. 字符串首尾存在空格或空白字符
比如表A的columnA里的EF3405TJ实际是EF3405TJ (末尾多了个空格),或者表B的columnB里是 EF3405TJ(开头多空格),这种情况下精确匹配=就会失败,但肉眼看两者是一样的。
你可以先试试用TRIM()函数去掉首尾空白后再匹配,修改后的查询语句如下:
方式一:JOIN查询
select * from tableA join tableB on TRIM(tableA.columnA) = TRIM(tableB.columnB);
方式二:IN子查询
select * from tableA where TRIM(columnA) in (select TRIM(columnB) from tableB);
2. 存在隐藏的控制字符
比如换行符、制表符这类看不见的字符,也会导致字符串看起来一样但实际不匹配。你可以先检查字符串的长度是否一致,来验证这个可能性:
-- 检查表A中columnA的长度 select columnA, LENGTH(columnA) from tableA; -- 检查表B中columnB的长度 select columnB, LENGTH(columnB) from tableB;
如果对应匹配值的长度不一样,就说明有隐藏字符。这种情况可以用REPLACE()函数去掉常见的控制字符,比如:
select * from tableA join tableB on REPLACE(REPLACE(tableA.columnA, CHAR(9), ''), CHAR(10), '') = REPLACE(REPLACE(tableB.columnB, CHAR(9), ''), CHAR(10), '');
(CHAR(9)是制表符,CHAR(10)是换行符,你可以根据实际情况调整)
验证数据的小技巧
你也可以直接用模糊查询先确认是否真的存在匹配:
select * from tableA where columnA like '%EF3405TJ%'; select * from tableB where columnB like '%EF3405TJ%';
如果这个查询能返回结果,就进一步说明是字符串有隐形差异导致精确匹配失败。
内容的提问来源于stack exchange,提问作者user7041535
相关产品推荐
相关产品推荐

