在T-SQL中将varchar转换为3个(有时是4个)字符

时间:2013-06-21 13:26:52

标签: sql tsql

我从数据库中选择数据。值为(字段名称为ADR_KOMP_VL):

4 , 61A, 100, 12, 58, 123C, 6 A, 5

我需要将这些值转换为3位数(除非有字母,否则为4)

因此转换后的值应为:

004, 061A, 100, 012, 058, 123C, 006A, 005

规则是:

  • 始终为3位数
  • 没有空格
  • 如果原始值小于三位数,请在其前面加上0(长度为3)
  • 如果原始值包含字母,请在其前面放置0(但长度为4)

对于"没有空间"部分我有这个:

select REPLACE(ADR_KOMP_VL, ' ','')

我到目前为止的解决方案是:

SELECT RIGHT('000' + CONVERT(VARCHAR(4),REPLACE(ADR_KOMP_VL, ' ','')), 3) 

但是当值中有没有字母时,这只会给我正确的长度。我的问题是如何处理值中的字母?

2 个答案:

答案 0 :(得分:2)

这只检查最后一个字符是否为字母。如果不是这样,则需要额外的逻辑

SELECT  REPLICATE('0', CASE WHEN ISNUMERIC(RIGHT(ADR_KOMP_VL, 1)) = 0 THEN 4
                            ELSE 3
                       END - LEN(REPLACE(ADR_KOMP_VL, ' ', '')))
        + REPLACE(ADR_KOMP_VL, ' ', '')
FROM    TX

编辑 - 实际上这可能效果更好,检查整个ADR_KOMP_VL是否为数字:

SELECT  REPLICATE('0', CASE WHEN ISNUMERIC(REPLACE(ADR_KOMP_VL, ' ', '')) = 0 THEN 4
                            ELSE 3
                       END - LEN(REPLACE(ADR_KOMP_VL, ' ', '')))
        + REPLACE(ADR_KOMP_VL, ' ', '')
FROM    TX

<强> SQLFiddle DEMO

答案 1 :(得分:1)

您可以使用案例陈述:

SELECT (case when ADR_KOMP_VL like '%[A-Z]%'
             then RIGHT('0000' + CONVERT(VARCHAR(4),REPLACE(ADR_KOMP_VL, ' ','')), 4) 
             else RIGHT('000' + CONVERT(VARCHAR(4),REPLACE(ADR_KOMP_VL, ' ','')), 3) 
        end)