WHERE子句中使用多列拼接值作为参数的SQL查询问题
用多列拼接值作为WHERE查询参数的解决方案
这当然是可行的!你遇到的第一种写法无结果的问题,大概率是数据格式不匹配或者隐式转换导致拼接结果与目标值不一致,咱们一步步来排查和修正:
1. 核心问题:拼接结果与PrimaryKey的格式差异
你手动输入'2018-04-16CMKKB113'能得到结果,但用CONCAT(tmp_date,Plant,FamilyName)不行,最常见的原因有两个:
- 日期类型的隐式转换问题:如果
tmp_date是日期/时间类型,数据库自动转成字符串时,格式可能和PrimaryKey里的日期片段不一致(比如带时分秒、或者格式是YYYYMMDD而非YYYY-MM-DD)。 - 字段含隐藏空格:
Plant或FamilyName字段可能包含前后空格,导致拼接后出现多余空格,和PrimaryKey无法匹配。
2. 修正步骤
第一步:显式格式化日期字段
把日期字段转成和PrimaryKey中完全一致的字符串格式,比如你的目标格式是YYYY-MM-DD:
- 若使用SQL Server:用
CONVERT(VARCHAR(10), tmp_date, 23)格式化日期 - 若使用MySQL:用
DATE_FORMAT(tmp_date, '%Y-%m-%d')格式化日期
第二步:去除字段的多余空格
用TRIM()函数清理Plant和FamilyName字段的前后空格,避免拼接后出现无效字符。
第三步:验证拼接结果是否匹配
先运行下面的语句,对比拼接结果和目标PrimaryKey是否完全一致:
-- SQL Server版本 SELECT CONCAT(CONVERT(VARCHAR(10), tmp_date, 23), TRIM(Plant), TRIM(FamilyName)) AS concat_result, PrimaryKey FROM b WHERE PrimaryKey = '2018-04-16CMKKB113' -- MySQL版本 SELECT CONCAT(DATE_FORMAT(tmp_date, '%Y-%m-%d'), TRIM(Plant), TRIM(FamilyName)) AS concat_result, PrimaryKey FROM b WHERE PrimaryKey = '2018-04-16CMKKB113'
如果concat_result和PrimaryKey完全相同,那修正后的查询就能正常工作了。
3. 修正后的最终查询语句
SQL Server:
SELECT [Less Total Backlog QTY] - Daily_Capacity FROM b WHERE PrimaryKey = CONCAT(CONVERT(VARCHAR(10), tmp_date, 23), TRIM(Plant), TRIM(FamilyName))
MySQL:
SELECT `Less Total Backlog QTY` - Daily_Capacity FROM b WHERE PrimaryKey = CONCAT(DATE_FORMAT(tmp_date, '%Y-%m-%d'), TRIM(Plant), TRIM(FamilyName))
关于你提到的IN写法
你考虑的WHERE PrimaryKey in (select concat_value from b)逻辑上存在问题:如果concat_value是这三列的拼接值,这个子查询会返回表中所有行的拼接结果,相当于把所有可能的拼接值都作为条件,会返回大量无关数据。除非你的表b中专门存储了正确的拼接值字段,否则这个写法并不适用。
内容的提问来源于stack exchange,提问作者Franz
相关产品推荐
相关产品推荐

