Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 防止在字母等级前引入零?_Sql_Sql Server 2008_Tsql_Case - Fatal编程技术网

Sql 防止在字母等级前引入零?

Sql 防止在字母等级前引入零?,sql,sql-server-2008,tsql,case,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

我在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等级时,是否可以防止前导零?修改现有案例陈述是否可行?我尝试添加以下内容:

WHEN GRADE = 'K' THEN 'K'

但这并没有解决问题,我的INSERT语句失败了。如果有人能提供帮助或知道更好的解决方案,请让我知道。谢谢大家!

这里有一种方法:

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

查询:

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

这里有一种方法:

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

查询:

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

这就是我要做的事情-

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

我会这样做的-

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

插入失败的错误消息是什么?@HABO在存在时之后。插入失败的错误消息是什么?@HABO在存在时之后。您建议对临时表执行此操作吗?有一件事我没有提到上面的Grade字段被设置为CHAR(2)。不一定,这只是我为你们准备的一个在你们的机器上运行的例子。您可以将下面的代码用于您的用例。数据类型无关紧要。您可以在示例中使用Char。如果LEN(Grade)=1且ISNUMERIC(Grade)=1,则“0”加Grade ELSE Grade end您建议对临时表执行此操作?有一件事我没有提到上面的Grade字段被设置为CHAR(2)。不一定,这只是我为你们准备的一个在你们的机器上运行的例子。您可以将下面的代码用于您的用例。数据类型无关紧要。您可以在示例中使用Char。如果LEN(Grade)=1且ISNUMERIC(Grade)=1,则“0”+Grade ELSE Grade end不需要两个前导零。我的成绩字段设置为字符(2)。因此,如果需要,只能输入0前导零。谢谢你的帮助!我的答案是基于你的密码。。。只需一个前导零,它就可以工作。不需要两个前导零。我的成绩字段设置为字符(2)。因此,如果需要,只能输入0前导零。谢谢你的帮助!我的答案是基于你的密码。。。它应该在只有一个前导零的情况下工作。