我正在使用存储过程,它将策略号作为参数,即varchar。当我们从表中检索时,我需要消除策略号的最后4个字符。但政策数字的数据并不一致,所以我很困惑如何使用这个逻辑。示例政策编号为:
这些是我们的表格中存在政策的四种格式。对于某些政策,没有拖尾结束' -000',因此这是具有挑战性的部分。现在,我需要消除拖尾部分' -000'从表中检索数据时的策略。
这是示例代码,它从表中提取策略数据。
Create Proc usp.dbo.policydataSP @policy_num varchar(18)
AS
Begin
Select * from policy_table pt
where pt.policy_num = @policy_num
End
答案 0 :(得分:2)
第1步:创建用户定义函数以规范化策略编号。
create function dbo.normalize_policy_num
(@policy_num varchar(100))
returns varchar(100)
as
begin
-- replace trailing digits
if (@policy_num like '%-[0-9][0-9][0-9]')
set @policy_num = left(@policy_num, len(@policy_num) - 4)
-- replace remaining hyphens
set @policy_num = replace(@policy_num, '-', '')
return @policy_num
end
这基本上做的是从包含模式的策略号中删除尾随的'-000',然后删除剩余的连字符。此功能似乎适用于您提供的政策编号:
-- returns: KSDRE0021
select dbo.normalize_policy_num('KSDRE0021-000')
-- returns: APDRE1021
select dbo.normalize_policy_num('APDRE-10-21-000')
-- returns: KSDRE0021
select dbo.normalize_policy_num('KSDRE0021')
-- returns: APDRE1021
select dbo.normalize_policy_num('APDRE-10-21')
第2步:修改您的SP,如下所示:
create proc usp.dbo.policydataSP
@policy_num varchar(18)
as
begin
select
dbo.normalize_policy_num(pt.policy_num) as normalized_policy_num,
pt.*
from policy_table pt
where dbo.normalize_policy_num(@policy_num) = dbo.normalize_policy_num(pt.policy_num)
注意:如果您能够修改表架构,则可以使用上面指定的UDF添加持久计算列。如果向其添加索引,查询将运行得更快。但是,插入会有一些惩罚,所以需要权衡。
答案 1 :(得分:0)
这可能是你最好的选择。将策略编号与请求参数的长度匹配:
Create Proc usp.dbo.policydataSP
@policy_num varchar(18)
AS
Begin
Select * from policy_table pt where LEFT(len(@policy_num),pt.policy_num) = @policy_num
End
答案 2 :(得分:0)
如果您只想在返回结果时删除-000
:
select case right(policy_num, 4)
when '-000' then left(policy_num, len(policy_num) - 4)
else policy_num end as policy_num
from policy_table pt
where pt.policy_num = @policy_num
如果要在短划线后删除任何3位数值:
select case when policy_num like '%-[0-9][0-9][0-9]' then left(policy_num, len(policy_num) - 4)
else policy_num end as policy_num
from policy_table pt
where pt.policy_num = @policy_num