需要消除字符串中的最后4个字符(varchar)

时间:2014-09-23 02:02:19

标签: sql-server sql-server-2008

我正在使用存储过程,它将策略号作为参数,即varchar。当我们从表中检索时,我需要消除策略号的最后4个字符。但政策数字的数据并不一致,所以我很困惑如何使用这个逻辑。示例政策编号为:

  1. KSDRE0021-000
  2. APDRE-10-21-000
  3. KSDRE0021
  4. APDRE-10-21
  5. 这些是我们的表格中存在政策的四种格式。对于某些政策,没有拖尾结束' -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
    

3 个答案:

答案 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