2

我从数据库中选择数据。值为(字段名称为 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) 

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

4

2 回答 2

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 演示

于 2013-06-21T13:37:49.340 回答
1

您可以使用 case 语句:

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)
于 2013-06-21T13:38:10.473 回答