SQL中InvoiceTitle字段子串提取优化及分期逻辑适配问询
针对clean.InvoiceFact表InvoiceTitle字段的SQL查询优化方案
核心问题修正方向
- 精准提取纯用户名,排除日期等前置干扰内容
- 清洗商户名,移除括号及内部冗余信息
- 重构分期逻辑,支持任意期数的识别
优化后SQL示例(以SQL Server为例)
SELECT -- 提取纯用户名:根据实际格式调整前后匹配标识,示例为「用户:」后、「商户」前的内容 SUBSTRING( InvoiceTitle, PATINDEX('%用户:%', InvoiceTitle) + 3, PATINDEX('%商户%', InvoiceTitle) - PATINDEX('%用户:%', InvoiceTitle) - 3 ) AS PureUserName, -- 提取无冗余商户名:移除括号及内部内容,兼容无括号的商户名 CASE WHEN PATINDEX('%(%', InvoiceTitle) > 0 THEN LEFT(InvoiceTitle, PATINDEX('%(%', InvoiceTitle) - 1) ELSE InvoiceTitle END AS CleanMerchantName, -- 识别任意分期数:支持「第X期」「分期X」等格式,提取数字部分 CASE WHEN PATINDEX('%第[0-9]%期%', InvoiceTitle) > 0 THEN SUBSTRING( InvoiceTitle, PATINDEX('%第[0-9]%期%', InvoiceTitle) + 1, PATINDEX('%期%', InvoiceTitle) - PATINDEX('%第[0-9]%期%', InvoiceTitle) - 1 ) WHEN PATINDEX('%分期[0-9]%', InvoiceTitle) > 0 THEN SUBSTRING( InvoiceTitle, PATINDEX('%分期[0-9]%', InvoiceTitle) + 2, PATINDEX('%[^0-9]%', SUBSTRING(InvoiceTitle, PATINDEX('%分期[0-9]%', InvoiceTitle) + 2, LEN(InvoiceTitle))) - 1 ) ELSE '非分期' END AS InstallmentNumber, -- 提取服务类型:示例为文本开头到第一个日期前的内容 LEFT( InvoiceTitle, PATINDEX('%[0-9]{4}-[0-9]{2}-[0-9]{2}%', InvoiceTitle) - 1 ) AS ServiceType FROM clean.InvoiceFact
规则适配说明
- 用户名提取:若实际格式中用户名的前后标识不同(如「姓名:XXX」「用户_XXX」),直接调整
PATINDEX中的匹配字符串即可 - 商户名清洗:如果存在其他冗余格式(如后缀冗余),可扩展
CASE分支处理 - 分期识别:针对「第N次还款」等特殊分期表述,可新增
CASE分支匹配对应格式 - 特殊格式兼容:其他数据库可替换为对应正则函数(如MySQL的
REGEXP_SUBSTR、PostgreSQL的REGEXP_MATCH)优化匹配逻辑
内容的提问来源于stack exchange,提问作者sci9
相关产品推荐
相关产品推荐

