如何从关联SQL表的PuniNaziv列中提取PW开头的指定字符串片段
实现思路
你需要的核心能力是从PuniNaziv字段中提取固定格式的PW前缀编码,不需要用IF流程控制语句,两种方案可选:
方案1:自动提取字符串(适配后续新增ID场景)
利用SQL字符串匹配函数定位PW编码的起止位置,直接提取,不需要硬编码ID对应关系,后续新增其他PW开头的产品也能自动适配:
SELECT ID, SUBSTRING( PuniNaziv, PATINDEX('%PW[0-9]%', PuniNaziv), -- 定位PW+数字的起始位置 CHARINDEX(' ', PuniNaziv, PATINDEX('%PW[0-9]%', PuniNaziv)) - PATINDEX('%PW[0-9]%', PuniNaziv) -- 计算PW编码的长度(到下一个空格截止) ) AS NazivCentrale FROM SifraArtikla
如果需要关联ArtikalUsluge表过滤数据,增加关联逻辑即可:
SELECT a.ID, SUBSTRING( a.PuniNaziv, PATINDEX('%PW[0-9]%', a.PuniNaziv), CHARINDEX(' ', a.PuniNaziv, PATINDEX('%PW[0-9]%', a.PuniNaziv)) - PATINDEX('%PW[0-9]%', a.PuniNaziv) ) AS NazivCentrale FROM SifraArtikla a INNER JOIN ArtikalUsluge b ON a.ID = b.ArtikalID
方案2:硬编码映射(稳定性最高)
如果ID和PW编码的对应关系固定不会变,直接用CASE WHEN做映射,完全不受字符串格式变化影响:
SELECT ID, CASE ID WHEN 1 THEN 'PW60' WHEN 2 THEN 'PW120' WHEN 3 THEN 'PW250' END AS NazivCentrale FROM SifraArtikla
原有代码报错原因
- 变量
@OznakaCentrale定义为NCHAR未指定长度,默认仅能存储1个字符,无法存储'PW%' - SQL的相等判断运算符是
=,不是== IF是SQL的全局流程控制语句,不能用于逐行数据的条件判断,逐行判断需使用CASE WHEN- 关联的表名、字段名和你给出的表结构不一致,你给出的关联表名为
ArtikalUsluge,关联字段为ArtikalID,代码中写的是ArtikliUslugeNaloga和Artikal1Id,会导致关联失败。
内容的提问来源于stack exchange,提问作者loranni
相关产品推荐
相关产品推荐

