防止字母等级前面的前导零?

时间:2017-09-05 12:30:01

标签: sql sql-server-2008 tsql case

我在SQL中使用CASE语句来检查Grade列的值。例如,如果用户输入7,我将前面的0保持在前面,因此值将保存为07。一切正常,直到我们在我们的应用程序中添加K等级作为选项。现在,如果用户输入K值将保存为0K。以下是我的SQL Case语句示例:

CASE 
   WHEN LEN(LTRIM(RTRIM(GRADE))) = 0 THEN NULL 
   ELSE RIGHT('00'+ISNULL(LTRIM(RTRIM(GRADE)),''),2) 
END

上面的代码用于INSERT SELECT语句。我想知道当用户进入K等级时是否可以阻止前导零?这是否可以修改现有的CASE语句?我试过添加这个:

WHEN GRADE = 'K' THEN 'K'

但这并没有解决问题,我的INSERT语句失败了。如果有人可以帮助或知道更好的解决方案,请告诉我。谢谢!

2 个答案:

答案 0 :(得分:2)

这是一种方法:

创建并填充样本表(在将来的问题中保存此步骤)

DECLARE @T AS TABLE
(
    GRADE varchar(3)
)

INSERT INTO @T VALUES
('7'), (''),('03'),('001'),('K'), (NULL)

查询:

SELECT  CASE WHEN LEN(LTRIM(RTRIM(GRADE))) = 0 THEN NULL
        WHEN GRADE NOT LIKE '%[^0-9]%' THEN RIGHT('00' + GRADE, 3) 
        ELSE GRADE
        END As Res
FROM @T 

结果:

Res
007
NULL
003
001
K
NULL

See a live demo on rextester.

答案 1 :(得分:2)

这就是我的方式 -

IF EXISTS(SELECT TOP 1 1 FROM sys.tables WHERE name = 'tb_Test')
BEGIN
    DROP TABLE dbo.tb_Test
END

CREATE TABLE dbo.tb_Test (ID INT IDENTITY(1,1) PRIMARY KEY, Grade NVARCHAR(10))

INSERT dbo.tb_Test (Grade)
VALUES ('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'),('10'),('K')

SELECT CASE WHEN LEN(Grade) = 1 AND ISNUMERIC(Grade) = 1 THEN '0'+Grade 
            WHEN ISNUMERIC(Grade) = 1 THEN Grade 
            WHEN ISNUMERIC(Grade) = 0 THEN Grade END
  FROM dbo.tb_Test