Oracle SQL技术问询:定位含首尾空格的列及具体值(适配多列)
找出含前导/尾随空格的列并输出明细SQL方案
问题场景
现有如下数据集,需要找出存在前导或尾随空格的列,并明确显示问题列、问题描述及对应值:
原数据集
WITH data AS ( SELECT '1' id, 'Jim' fname, 'Jam' lname FROM dual UNION SELECT '2' id, 'Jon' fname, 'Doe ' lname FROM dual UNION SELECT '3' id, 'Sam' fname, 'Lee' lname FROM dual )
原查询的不足
原查询仅能筛选出存在问题的行,但无法明确指出具体哪一列有问题:
SELECT * FROM data WHERE fname LIKE ' %' OR fname LIKE '% ' OR lname LIKE ' %' OR lname LIKE '% ';
输出仅显示行数据,无法定位问题列:
| ID | FNAME | LNAME | |----|-------|-------| | 2 | Jon | Doe |
目标输出格式
期望得到能明确标注问题的结果:
| ID | FIELD_NAME | ISSUE_DESCRIPTION | FIELD_VALUES | |----|------------|-------------------|--------------| | 2 | LNAME | 尾随空格 | Doe |
适配多列的解决方案
针对35+列的场景,可通过UNION ALL将每一列的检查逻辑拆分,批量生成结果:
WITH data AS ( SELECT '1' id, 'Jim' fname, 'Jam' lname FROM dual UNION SELECT '2' id, 'Jon' fname, 'Doe ' lname FROM dual UNION SELECT '3' id, 'Sam' fname, 'Lee' lname FROM dual ) -- 检查fname列 SELECT id, 'FNAME' AS field_name, CASE WHEN fname LIKE ' %' THEN '前导空格' WHEN fname LIKE '% ' THEN '尾随空格' ELSE '前后均有空格' END AS issue_description, TRIM(fname) AS field_values FROM data WHERE fname LIKE ' %' OR fname LIKE '% ' UNION ALL -- 检查lname列 SELECT id, 'LNAME' AS field_name, CASE WHEN lname LIKE ' %' THEN '前导空格' WHEN lname LIKE '% ' THEN '尾随空格' ELSE '前后均有空格' END AS issue_description, TRIM(lname) AS field_values FROM data WHERE lname LIKE ' %' OR lname LIKE '% ' -- 后续列以此类推,复制上述结构替换列名即可
说明
- 每一列对应一个
SELECT块,通过UNION ALL合并结果,无需修改主查询逻辑,仅需替换列名即可快速适配35+列的检查需求 TRIM()函数用于返回去除前后空格后的原始有效值CASE语句精准区分前导空格、尾随空格或两者皆有的情况
内容的提问来源于stack exchange,提问作者Shantanu
相关产品推荐
相关产品推荐

