SQL查询中如何按条件判断拼接package_version_name与version_number两列
原有逻辑存在的问题
原有写法不能完全覆盖需求,存在以下几处缺陷:
- 判断逻辑过于宽松:仅判断
pv.Name包含右括号)就直接返回原值,会误判名称中间带括号但未包含完整版本号的场景,比如名称为测试)版本的情况,不符合预期。 - 拼接语法兼容性差:用
+做字符串拼接仅适用于SQL Server等少数数据库,PostgreSQL、Snowflake、MySQL等多数数据库不支持该写法,会被识别为数值加法抛出报错,且任意字段为NULL时会导致拼接结果整体为NULL。 - 语法错误:IF表达式未设置新列别名,且该表达式末尾多写了多余逗号,直接执行会报语法错误。
- 未处理空值场景:左连接关联
pv表可能出现匹配不到的情况,此时pv.Name为NULL,原有逻辑未做兜底处理。
更优实现方案
推荐用更精准的正则匹配判断+兼容度更高的拼接函数实现,示例代码适配多数SQL方言(如需适配特定数据库可调整正则和函数写法):
SELECT sf_li.sf_lma_version_number_c AS version_number, pv.name AS package_version_name, -- 正则匹配名称末尾是否为 (x.x.x) 格式的版本号 CASE WHEN pv.name IS NULL THEN COALESCE(sf_li.sf_lma_version_number_c, '未知版本') WHEN REGEXP_LIKE(pv.name, '\\([0-9]+\\.[0-9]+\\.[0-9]+\\)$') THEN pv.name ELSE CONCAT(pv.name, ' (', sf_li.sf_lma_version_number_c, ')') END AS version_release FROM "prod"."salesforce"."sf_lma_license_c" sf_li LEFT JOIN "prod"."salesforce"."sf_lma_package_version_c" pv ON sf_li.sf_lma_package_version_c = pv.id
优化点说明:
- 用正则匹配名称末尾是否符合
(数字.数字.数字)的版本号格式,判断准确性大幅提升,避免误判 - 用
CONCAT函数做字符串拼接,兼容绝大多数主流SQL方言,且不会因单个字段为NULL导致整体结果为NULL - 增加了
pv匹配不到时的空值兜底逻辑,避免出现NULL结果 - 用CASE代替IF,可读性和兼容性更强
- 修正了原有语法错误,给新列增加了
version_release别名
如果你的数据库不支持正则函数,也可以简化判断逻辑为WHEN RIGHT(pv.name, 1) = ')' AND CHARINDEX('(', pv.name) > 0,虽然精度比正则低,但比原有仅判断包含右括号的逻辑更可靠。
内容的提问来源于stack exchange,提问作者Karthikcharan Suresh
相关产品推荐
相关产品推荐

