我从数据库中选择数据。值为(字段名称为ADR_KOMP_VL):
4 , 61A, 100, 12, 58, 123C, 6 A, 5
我需要将这些值转换为3位数(除非有字母,否则为4)
因此转换后的值应为:
004, 061A, 100, 012, 058, 123C, 006A, 005
规则是:
对于"没有空间"部分我有这个:
select REPLACE(ADR_KOMP_VL, ' ','')
我到目前为止的解决方案是:
SELECT RIGHT('000' + CONVERT(VARCHAR(4),REPLACE(ADR_KOMP_VL, ' ','')), 3)
但是当值中有没有字母时,这只会给我正确的长度。我的问题是如何处理值中的字母?
答案 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)