sql - 重构 Oracle SQL 查询
问题描述
示例表 (IP)
ID IP_NO PHONE
----- -------- ---------
101 192.205.230.70 +535950331
10# 192.205a.230.70 +672819233
103 192.205.230.72 +991873112
10! 192.205.230.78 +764616233
我现在正在使用的查询:
SELECT 'IP' as TABLE, COUNT(*) AS ERROR_COUNT, 'mt.ID' AS COLUMN FROM ip
WHERE LENGTH(TRIM(TRANSLATE(ip.id, '0123456789', ' '))) > 0
OR ip.id IS NULL
UNION
SELECT 'IP' as TABLE, COUNT(*) AS ERROR_COUNT, 'mt.ip_no' AS COLUMN FROM ip
WHERE LENGTH(TRIM(TRANSLATE(ip.ip_no, '0123456789.', ' '))) > 0
OR ip.ip_no IS NULL
UNION
SELECT 'IP' as TABLE, COUNT(*) AS ERROR_COUNT, 'mt.phone' AS COLUMN FROM ip
WHERE LENGTH(TRIM(TRANSLATE(ip.phone, '+0123456789', ' '))) > 0
OR ip.phone IS NULL
上述查询的结果表:
TABLE ERROR_COUNT COLUMN
----- ----------- ------
IP 2 mt.id
IP 1 mt.ip_no
IP 0 mt.phone
我想要的结果表:
TABLE INVALID_CHAR COLUMN
----- ----------- ------
IP # mt.id
IP ! mt.id
IP a mt.ip_no
是否可以转换上述查询以查看结果表中的无效字符?
解决方案
这应该工作
SELECT 'IP' as t, TRIM(TRANSLATE(ip.id, '0123456789', ' ')) AS INVALID_CHAR, 'mt.ID' AS c FROM ip
WHERE LENGTH(TRIM(TRANSLATE(ip.id, '0123456789', ' '))) > 0
UNION
SELECT 'IP' as t, TRIM(TRANSLATE(ip.ip_no, '0123456789.', ' ')) AS INVALID_CHAR, 'mt.ip_no' AS c FROM ip
WHERE LENGTH(TRIM(TRANSLATE(ip.ip_no, '0123456789.', ' '))) > 0
UNION
SELECT 'IP' as t, TRIM(TRANSLATE(ip.phone, '+0123456789', ' ')) AS INVALID_CHAR, 'mt.phone' AS c FROM ip
WHERE LENGTH(TRIM(TRANSLATE(ip.phone, '+0123456789', ' '))) > 0
推荐阅读
- javascript - 在移动视图中调整表格的布局
- flutter - 在 Flutter Web 应用程序中使用 rootBundle 加载资产 - 未执行的空值错误
- deep-learning - 如何将模型数据传输到另一个网络?
- kubernetes - 将 docker-compose redis 文件转换为在 kubernetes 上工作
- django - DateTimeField 编辑时不显示以前的日期和时间
- c# - 通过注入访问 AppConfig 设置
- r - 通过模糊字符串匹配和 R 中的分组摘要创建新变量的有效方法
- javascript - 为什么我收到“超出最大调用堆栈大小”错误?
- sql - PostgreSQL:如何仅从 SELECT 中获取第一个结果
- email - Firebase 身份验证使用 Google 域设置自定义域