SQL中使用if else条件按规则截取ndc字段sub string的方法咨询
NDC字段截取逻辑SQL实现方案
核心实现代码(兼容绝大多数SQL数据库)
SELECT CASE -- 匹配以NOT APP开头的取值,截取前14位 WHEN ndc LIKE 'NOT APP%' THEN SUBSTR(ndc, 1, 14) -- 匹配以数字开头的取值,截取前11位 WHEN LEFT(ndc, 1) BETWEEN '0' AND '9' THEN SUBSTR(ndc, 1, 11) -- 其余场景可自定义返回值,默认返回原始值 ELSE ndc END AS processed_ndc FROM 你的表名;
注意事项
- 字符串索引适配:主流SQL数据库(MySQL、PostgreSQL、Oracle、SQL Server)的
SUBSTR函数默认从1开始计数,如果你使用的数据库字符串索引从0开始,将上述代码中的起始位参数1改为0即可。 - 开头匹配规则:不要使用
%NOT APP%作为匹配条件,前后加通配符为全局包含匹配,仅后缀加通配符的NOT APP%才是开头匹配,符合需求。 - 数字开头判断的正则写法(可选):如果需要更严谨的判断,可对应数据库替换数字开头的判断条件:
- MySQL/PostgreSQL:
ndc REGEXP '^[0-9]' - Oracle:
REGEXP_LIKE(ndc, '^[0-9]') - SQL Server:
ndc LIKE '[0-9]%'
- MySQL/PostgreSQL:
功能验证方法
你可以执行以下测试语句验证截取结果是否符合预期,无需操作业务表:
SELECT ndc, CASE WHEN ndc LIKE 'NOT APP%' THEN SUBSTR(ndc, 1, 14) WHEN LEFT(ndc, 1) BETWEEN '0' AND '9' THEN SUBSTR(ndc, 1, 11) ELSE ndc END AS processed_ndc FROM ( SELECT '00037002207 EN' AS ndc UNION ALL SELECT '64370042140 CR' AS ndc UNION ALL SELECT 'NOT APPLICABLE' AS ndc ) test_data;
内容的提问来源于stack exchange,提问作者Aruna
相关产品推荐
相关产品推荐

