【问题标题】:SQL Server replace different characters in a column valueSQL Server 替换列值中的不同字符
【发布时间】:2020-10-03 11:57:45
【问题描述】:

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

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

zone、bay、shelf 可以从 1 到 99。

我的问题是与 1 位或 2 位不一致,最后一个字符 'B' 可能被误认为是 Bay 号。

感谢您的帮助。

【问题讨论】:

  • 我想使用 regexp_replace,但它不适用于 MS SQL 服务器。并感谢您修复格式演示文稿。显然,TRANSLATE 不适用于 SQL EXPRESS 2017。

标签: sql sql-server replace sql-update


【解决方案1】:

2 解决方案。第一个解决方案来自Analyst & 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 '%&'

【讨论】:

  • 如果条码类似于“Z23B4S56Z”怎么办......将不得不编写另一个更新......??
  • 此外,我强烈反对在数据库级别进行这样的格式化的想法。它应该在表示层完成......
  • 。它应该在表现层完成......你能进一步解释吗?数据需要以某种方式更新/替换,不是吗?
【解决方案2】:

我相信有一种更漂亮的方法可以做到这一点,但我只是想回馈给我这么多的论坛。希望对您有所帮助。

这会产生 4 列。
1. 区域
2. 货架
3. 海湾
4. ZoneBayShelf(最后一列只是前三列的串联)

使用 SUBSTR 和 LOCATE 函数的组合来找到切割条形码的点。 CONCAT 只是为了把它完全带来。

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

【讨论】:

  • 有问题。 SUBSTR 不是 MS SQL-SERVER 的内置函数。我用 SUBSTRING 替换了,但 LOCATE 也不支持
  • 如果有人使用 Oracle SQL regexp_replace,想知道是否可能
【解决方案3】:

它可能看起来有点乱,但我认为下面的代码应该可以帮助你:

首先选择我们感兴趣的字符串部分:

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

【讨论】:

  • 还是不行,试试这个数据:('Z1B1S1A'),('Z10B10S10B'),('Z23B4S56C'),('Z23B44S6B')
  • 立即尝试..希望对您有所帮助!!
猜你喜欢
  • 1970-01-01
  • 2021-12-07
  • 2010-10-23
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2017-01-06
  • 1970-01-01
相关资源
最近更新 更多