首页 > 解决方案 > 在 SQL Server 中使用 case when 和 substring 时防止删除前导零

问题描述

我有一个像这样的变量

DECLARE @CODE NVARCHAR(10) = '09000:09502';

我需要将@CODE变量拆分为两个变量并将它们插入到临时表中以进行批量插入。

但是当我在我的选择语句中使用“CASE WHEN”时,拆分后的值将删除前导零,“09000”将变为“9000”(似乎这些值被视为数字而不是字符串)。即使我使用 CAST 功能,它仍然无法正常工作。

我使用此代码进行了一些测试:

DECLARE @CODE   VARCHAR(10) = '09000:09502';
DECLARE @Split1 VARCHAR(10) = '';
DECLARE @Split2 VARCHAR(10) = '';

SET @Split1 = CAST((CASE WHEN CHARINDEX(':', @CODE) > 0 
                            THEN LEFT(@CODE, CHARINDEX(':', @CODE) - 1)
                            ELSE -1 
                    END) AS VARCHAR(20))
SET @Split2 = LEFT(@CODE, 5);

PRINT(@Split1);
PRINT(@Split2);

我得到的输出是:

9000
09000

当我没有使用'CASE WHEN'时,我可以得到我想要的值,但是我使用'CASE WHEN',前导零将被删除。

在 SQL Server 存储过程中使用CASE WHEN和运行时,如何保留前导零值?LEFT

提前致谢。

标签: sql-serverstored-procedures

解决方案


CASE一条语句的所有分支必须返回相同的数据类型。
当您-1在 else 部分返回时,此 CASE 返回的值将转换为整数,因此09000将变为9000.
您可以更改-1'-1'.

DECLARE @CODE    VARCHAR(11) = '09000:09502';
DECLARE @Split1  VARCHAR(10) = '';
DECLARE @Split2  VARCHAR(10) = '';
SET @Split1      = CASE 
                     WHEN CHARINDEX(':',@CODE)>0 THEN LEFT(@CODE, CHARINDEX(':', @CODE)-1)
                     ELSE '-1' 
                   END
SET @Split2      = RIGHT(@CODE, LEN(@CODE)-CHARINDEX(':', @CODE));
PRINT(@Split1);
PRINT(@Split2);

这样你就不需要这个CAST()功能了。
您还声明@CODEVARCHAR(10),这截断了最后一个字符。
更改为VARCHAR(11)
另外,我想您希望@Split2分配正确的5 个字符,@CODE而不是代码中的左侧。

请参阅演示


推荐阅读