sql server替换列值中的不同字符

3pvhb19x  于 2021-08-09  发布在  Java
关注(0)|答案(3)|浏览(409)

我有一个条形码列,其中包含如下数据:

Z1B1S1A         -- Zone 1 Bay 1 Shelf 1A
Z10B10S10B      -- Zone 10 Bay 10 Shelf 10B

要将其替换为:

01-01-01A          -- I think I can get by with  1-1-1A
10-10-10B

区域,间隔,架子可以从1到99。
对我来说,问题是与1或2个数字不一致,最后一个字符“b”可能会被误认为间隔号。
谢谢你的帮助。

xjreopfe

xjreopfe1#

2种解决方案。第一个解决方案来自分析师和deepshikha 1的帮助和想法。第一个解决方案

-- SUBSTRING ( expression ,start , length )
-- CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
select substring(Barcode,2,charindex('B',barcode)-2) AS Zoney,
       substring(Barcode,charindex('B',Barcode)+1, charindex('S',Barcode)-charindex('B',Barcode)-1) AS Bay,
       substring(Barcode,charindex('S',Barcode)+1,len(Barcode)) AS Shelf,

concat (
        substring(Barcode,2,charindex('B',barcode)-2),'-',
        substring(Barcode,charindex('B',Barcode)+1, charindex('S',Barcode)-charindex('B',Barcode)-1), '-',
       substring(Barcode,charindex('S',Barcode)+1,len(Barcode)) 
       ) AS ZBS

from TB_BarcodeTag4 
where  Barcode LIKE 'Z%B%S%'

2. Second solution is from my own

    UPDATE TB_BarcodeTag4
    SET Barcode = STUFF(Barcode, LEN(Barcode),1, '&')
    WHERE Barcode LIKE 'Z%B%S%' AND Barcode like '%B'

    UPDATE TB_BarcodeTag4
    SET Barcode = REPLACE(REPLACE(REPLACE(Barcode, 'Z', ''),'B','-'),'S','-')
    WHERE Barcode LIKE 'Z%B%S%'

    UPDATE TB_BarcodeTag4
    SET Barcode = STUFF(Barcode, LEN(Barcode),1, 'B')
    WHERE Barcode LIKE 'Z%B%S%' AND Barcode like '%&'
oo7oh9g9

oo7oh9g92#

我有信心有一个更美丽的方式来做到这一点,但只是想回馈给论坛,给了我这么多。希望有帮助。
这将生成4列。
1.区
2.架子
3.海湾
4.zonebayshelf(最后一列只是前三列的串联)
使用substr和locate函数的组合来查找要剪切条形码的点。只是为了把它一起带来。

SELECT
    SUBSTR(BARCODE,2,LOCATE("Z",BARCODE, 1)) AS ZONE,
    SUBSTR(BARCODE,LOCATE("B",BARCODE, 1),
        LOCATE("B",BARCODE, 1)-LOCATE("Z",BARCODE, 1)) AS BAY,
    SUBSTR(BARCODE,LOCATE("S",BARCODE, 1),
        LEN(BARCODE)) AS SHELF,
    CONCAT( SUBSTR(BARCODE,2,LOCATE("Z",BARCODE, 1)),
            "-", SUBSTR(BARCODE,LOCATE("B",BARCODE, 1),
              LOCATE("B",BARCODE, 1)-LOCATE("Z",BARCODE, 1)).
            "-", SUBSTR(BARCODE,LOCATE("S",BARCODE, 1),
              LEN(BARCODE))
          ) AS ZoneShelfBay 
FROM DATABASE
am46iovg

am46iovg3#

它可能看起来有点混乱,但我认为以下代码应该可以帮助您:
首先选择我们感兴趣的字符串部分:

declare @T1 table (barcode varchar(max))
insert into @T1 values('Z1B1S1A'),('Z10B10S10B'),('Z99B99S99C')

select substring(barcode,2,charindex('B',barcode)-2),
       substring(barcode,charindex('B',barcode)+1,
                 charindex('S',Barcode)-charindex('B',Barcode)-1),
       substring(barcode,charindex('S',barcode)+1,len(barcode))

from @T1

现在我们可以根据需要格式化:

select right('00'+ substring(barcode,2,charindex('B',barcode)-2),2)
       +'-'+
       right('00' + 
              substring(barcode,charindex('B',barcode)+1,
              charindex('S',Barcode)-charindex('B',Barcode)-1),2)
       +'-'+
       right('000' + 
              substring(barcode,charindex('S',barcode)+1,
              len(barcode)),3)
       from @T1

相关问题