如何编写SQL从BILL表DOCCLASS字段中提取匹配CLASS表的对应子串
问题说明
涉及业务表结构
CLASS表
主键为Class字段,存储分类编码与对应描述,数据如下:
| Class | 描述 |
|---|---|
| F | 工厂 |
| H | 总部 |
| C001 | 电气 |
| C002 | 机械 |
| C003 | 土木 |
BILL表
存储账单信息,包含BILL_NO(账单编号)、DOCCLASS(单据分类编码)字段,示例数据如下:
| BILL_NO | DOCCLASS |
|---|---|
| 1 | FC001 |
| 2 | FC002 |
| 3 | FC003 |
业务规则
生成账单时会将CLASS表中的多个分类编码拼接后赋值给DOCCLASS字段,例如账单1的DOCCLASS值为FC001,对应F(工厂)和C001(电气)两个分类编码的拼接。
需求与现有问题
需要编写SQL查询,从账单的DOCCLASS值中提取出类似C001的明细分类编码,匹配CLASS表返回对应描述。原有SQL采用等值连接方式,返回的是拼接后所有编码的描述合并结果,不符合要求,原有SQL如下:
Select BILLDET.BILL_NO, BILLDET.CLASS, BILLDET.GLCODE, CLASS.DESCRIPT From BILLDET Full Join CLASS On BILLDET.CLASS = CLASS.CLASS
原有错误输出:
| 账单编号 | 描述 |
|---|---|
| 1 | 工厂电气 |
实现方案
注:若实际账单表名为
BILLDET,将SQL中的BILL替换为BILLDET即可。
通用方案:模糊匹配(适配所有数据库)
通过LIKE匹配DOCCLASS中包含的CLASS编码,再过滤出C开头的明细分类即可:
SELECT b.BILL_NO AS 账单编号, c.Class AS 明细分类编码, c.Description AS 明细分类描述 FROM BILL b INNER JOIN CLASS c ON b.DOCCLASS LIKE CONCAT('%', c.Class, '%') WHERE c.Class LIKE 'C%' -- 过滤目标C开头的明细编码 -- 若只需查询账单1,可加条件 AND b.BILL_NO = 1
查询结果(以账单1为例)
| 账单编号 | 明细分类编码 | 明细分类描述 |
|---|---|---|
| 1 | C001 | 电气 |
高兼容方案:固定长度截取(编码规则固定时使用)
如果编码规则固定:首位为1位一级编码(F/H),后4位为C开头的明细编码,可直接截取后4位精准匹配:
SELECT b.BILL_NO AS 账单编号, c.Class AS 明细分类编码, c.Description AS 明细分类描述 FROM BILL b INNER JOIN CLASS c ON RIGHT(b.DOCCLASS, 4) = c.Class -- 若只需查询账单1,可加条件 WHERE b.BILL_NO = 1
内容的提问来源于stack exchange,提问作者shiva baral
相关产品推荐
相关产品推荐

