【问题标题】:Prevent leading zero in front of the letter grade?防止字母等级前导零?
【发布时间】:2018-02-13 18:04:36
【问题描述】:

我在 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 语句失败了。如果有人可以提供帮助或知道更好的解决方案,请告诉我。谢谢!

【问题讨论】:

  • 插入失败的错误信息是什么?
  • @HABO 存在时间后。

标签: sql sql-server-2008 tsql case


【解决方案1】:

这就是我会做的方式 -

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

【讨论】:

  • 您建议对临时表执行此操作?我没有在上面提到的一件事 Grade 字段设置为 CHAR(2)。
  • 不一定,这只是我整理的一个示例,供您在您的机器上运行。您可以将以下内容用于您的用例。数据类型无关紧要。您可以在示例中使用 Char。 CASE WHEN(Grade) = 1 AND ISNUMERIC(Grade) = 1 THEN '0'+Grade ELSE Grade END
【解决方案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.

【讨论】:

  • 不需要两个前导零。我的成绩字段设置为 CHAR(2)。因此,如果需要,只能输入 0 前导零。感谢您的帮助!
  • 我的答案是基于您的代码...它应该与只有一个前导零相同。
猜你喜欢
  • 2022-12-13
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多