只读权限下如何合并多列不匹配信息为单列并创建视图
完善后的SQL解决方案
方案一(支持CONCAT_WS的数据库,如MySQL、PostgreSQL、SQL Server 2017+)
SELECT -- 替换为你需要保留的两表原始数据列 A_FirstName, B_FirstName, A_Email, B_Email, A_Telephone, B_Telephone, -- 自动拼接不匹配错误信息,避免多余分隔符 CONCAT_WS( '--', CASE WHEN FirstNameCheck = 'MISMATCHED IN FIRST NAME' THEN '姓名不匹配:A表值=' || A_FirstName || ',B表值=' || B_FirstName END, CASE WHEN EmailCheck = 'MISMATCHED IN EMAIL' THEN '邮箱不匹配:A表值=' || A_Email || ',B表值=' || B_Email END, CASE WHEN TelephoneCheck = 'MISMATCHED IN TELEPHONE' THEN '电话不匹配:A表值=' || A_Telephone || ',B表值=' || B_Telephone END ) AS Error_Message FROM ( -- 此处替换为生成样本数据的原始查询 query-which gives the sample data ) AS combined_data WHERE FirstNameCheck = 'MISMATCHED IN FIRST NAME' OR EmailCheck = 'MISMATCHED IN EMAIL' OR TelephoneCheck = 'MISMATCHED IN TELEPHONE'
方案二(兼容旧版数据库,如SQL Server 2016及更早版本)
SELECT -- 替换为你需要保留的两表原始数据列 A_FirstName, B_FirstName, A_Email, B_Email, A_Telephone, B_Telephone, -- 手动拼接后移除末尾多余的分隔符 TRIM(TRAILING '--' FROM CONCAT( CASE WHEN FirstNameCheck = 'MISMATCHED IN FIRST NAME' THEN '姓名不匹配:A表值=' + A_FirstName + ',B表值=' + B_FirstName + '--' ELSE '' END, CASE WHEN EmailCheck = 'MISMATCHED IN EMAIL' THEN '邮箱不匹配:A表值=' + A_Email + ',B表值=' + B_Email + '--' ELSE '' END, CASE WHEN TelephoneCheck = 'MISMATCHED IN TELEPHONE' THEN '电话不匹配:A表值=' + A_Telephone + ',B表值=' + B_Telephone + '--' ELSE '' END )) AS Error_Message FROM ( -- 此处替换为生成样本数据的原始查询 query-which gives the sample data ) AS combined_data WHERE FirstNameCheck = 'MISMATCHED IN FIRST NAME' OR EmailCheck = 'MISMATCHED IN EMAIL' OR TelephoneCheck = 'MISMATCHED IN TELEPHONE'
关键说明
CONCAT_WS会自动忽略NULL值,仅在存在有效错误信息时添加--分隔符,避免出现开头或末尾多余的符号。- 每个CASE语句生成包含具体表值的错误描述,便于直接定位不匹配内容。
- 保留原WHERE条件,确保仅返回存在不匹配的记录,过滤完全匹配的行。
- 可根据实际需求调整SELECT子句中的原始数据列,保留需要展示的字段。
内容的提问来源于stack exchange,提问作者sarika1810
相关产品推荐
相关产品推荐

