2017-09-05 4 views
1

私はCASEステートメントをSQLで使用して、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ステートメントは失敗しました。誰かが助けることができる、またはよりよい解決を知っていれば私に知らせてください。ありがとうございました!ここで

+1

失敗した挿入のためのエラーメッセージは何か? @HABOの後はいつも – avb

+0

です。 –

答えて

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

これを一時テーブルで行うことをお勧めしますか? Gradeフィールドの上で言及しなかったことの1つは、CHAR(2)に設定されています。 –

+1

必ずしもあなたのマシンで実行するための例ではありません。あなたはあなたのユースケースのために以下を使用することができます。データ型は関係ありません。この例ではCharを使用できます。 レンズ(グレード)= 1、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

2つの先行ゼロは必要ありません。 My GradeフィールドはCHAR(2)に設定されています。したがって、必要に応じて0の先行ゼロのみを入力することができます。ご協力いただきありがとうございます! –

+0

私はあなたのコードに私の答えを基づいていた...それは1つの先行ゼロと同じように動作するはずです。 –

関連する問題