SQL字符串操作和字符替换

时间:2014-07-30 11:34:29

标签: sql sql-server

我有一个数据库,其中包含需要更新为新格式的旧ItemID列表。

旧格式的格式为8046Y,新格式将第4个数字移动到末尾并添加连字符,如果它是单个数字,则添加0。当数字超过9时,旧格式也使用字母字符,例如464HB,其中H代表17.我还需要在新格式的开头添加1。所有这些都可以通过SQL中的字符串操作来完成。我希望。

一些例子:

8046Y becomes 1804Y-06
464HB becomes 1464B-17 (H = 17)

有人可以给我一些关于如何在SQL中解决这个问题的指示吗?

我得到了:

select '1' + LEFT(ItemID, 3) + RIGHT(ItemID,1) + '-' + '0' + SUBSTRING(ItemID,3,1) from items

但是从a = 10到z = 36的转换让我感到难过

5 个答案:

答案 0 :(得分:1)

因为我不知道除了' H'之外是否还有其他特殊字符需要考虑。只包括这个单一字符。

DECLARE @val CHAR(5) = '464HB'
SELECT @val, '1' + LEFT(@val,3)+SUBSTRING(@val,5,1)+'-'+CASE WHEN +SUBSTRING(@val,4,1)='H' THEN '17' ELSE '0'+SUBSTRING(@val,4,1) END

答案 1 :(得分:1)

select '1' + LEFT(ItemID, 3) + RIGHT(ItemID,1) + '-'
    +CASE RIGHT(LEFT(ItemID,1),2)
        WHEN 'a' then 10
        WHEN 'b' THEN 11
        etc...
    END [NewItemID]
 from items

只需以该格式添加适当的案例。

答案 2 :(得分:1)

我只是为了挑战,我不推荐使用

DECLARE @id varchar(5) = '8046Y'
--SET @id = '464HB'

SELECT 
    '1' + 
    LEFT(@id, 3) + 
    RIGHT(@id, 1) + 
    '-' + 
    CASE WHEN ISNUMERIC(RIGHT(LEFT(@id, 4), 1)) = 1 THEN
            RIGHT(LEFT(@id, 4), 1)
         ELSE
            RIGHT('00' + CONVERT(VARCHAR, ASCII(RIGHT(LEFT(@id, 4), 1)) - 64 + 9), 2)
    END

-64表示开始ASCII A,+ 9表示常规

答案 3 :(得分:1)

试试这个:

select 
'1' 
+ left(@str,3) 
+ right(@str,1) 
+ '-' 
+ case 
      when substring(@str,4,1) like '%[0-9]%' 1 then right('00' + substring(@str,4,1),2)
      else cast(10 + ascii(substring(@str,4,1))-ascii('A') as varchar(2)) 
  end

说明:如果第4个字符是数字,则不要更改该值,并在填充后用零添加。否则,使用ASCII获取该字符的ASCII值,使其与“A' A'的值相区别。并添加10的偏移量。

Demo

答案 4 :(得分:0)

就个人而言,我为它创建了一个功能。

  1. 创建一个变量来处理新值。
  2. 通过SUBSTRING操纵位置,您也可以使用RIGHT或LEFT
  3. 在单位数字中添加零时,只需执行条件语句
  4. 关于将字母转换为数字(例如字母H),第一个字母的转换值为65,假设它是全部资本。因此,A = 65,B = 66,H = 72,依此类推。在操作值时使用此数据。嗯,我会给你我的想法,但你可以优化它(因为我没有很多时间)。
  5. 以H = 17为例,A = 10。只需在转换中减去55即可。所以H = 72(-55)变为17.这适用于所有字母(仅以大写字母)。

    我认为这足以引导你。希望这会有所帮助。