我有一个数据库,其中包含需要更新为新格式的旧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的转换让我感到难过
答案 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的偏移量。
答案 4 :(得分:0)
就个人而言,我为它创建了一个功能。
以H = 17为例,A = 10。只需在转换中减去55即可。所以H = 72(-55)变为17.这适用于所有字母(仅以大写字母)。
我认为这足以引导你。希望这会有所帮助。