sql-server - 在 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
提前致谢。
解决方案
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()
功能了。
您还声明@CODE
为VARCHAR(10)
,这截断了最后一个字符。
更改为VARCHAR(11)
。
另外,我想您希望@Split2
分配正确的5 个字符,@CODE
而不是代码中的左侧。
请参阅演示。
推荐阅读
- c# - Audit.Net MVC - 如何解决 NullReferenceException?
- reactjs - 为什么在输入更改时重新渲染功能组件中的所有元素
- javascript - moment.utc('date string').format('DD-MMM-YYYY') 返回上一个日期
- c# - 在不同的机器 C# 中生成和签署证书
- jquery - JQuery .nextUntil() 选择标题进入 li
- javascript - 如何创建多个popper实例?
- r - 如果 X 中的列为 FALSE,则删除 Y 中的相同列?
- r - 错误:`position` 必须是字符串或位置对象,而不是具有类标签的 S3 对象
- ios - registerUserNotificationSettings 没有触发代表并且推送通知无法正常工作我的项目
- java - 垃圾收集如何识别孤立对象?