2017-09-05 55 views
1

我在SQL中使用CASE語句來檢查成績列的值。例如,如果用戶輸入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語句失敗。如果有人能幫助或者知道更好的解決方案,請告訴我。謝謝!

+1

什麼是失敗插入的錯誤信息? – avb

+0

@HABO現有之後。 –

回答

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 
+0

您正在建議使用臨時表執行此操作嗎?有一件事,我沒有提到上面的成績字段被設置爲CHAR(2)。 –

+1

不一定,這只是我放在一起讓你在機器上運行的一個例子。你可以使用下面的用例。數據類型無關緊要。你可以用Char來舉例。 CASE WHEN LEN(成績)= 1 AND ISNUMERIC(成績)= 1 THEN'0'+成績ELSE成績END – GrantD

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.

+0

不需要兩個前導零。我的成績字段設置爲CHAR(2)。因此,如果需要,只能輸入0前導零。謝謝你的幫助! –

+0

我是基於你的代碼我的答案......它應該只有一個領先的零相同。 –