【问题标题】:Need to eliminate the last 4 characters in a string(varchar)需要消除字符串中的最后 4 个字符(varchar)
【发布时间】:2014-09-24 00:29:31
【问题描述】:

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

  1. KSDRE0021-000
  2. APDRE-10-21-000
  3. KSDRE0021
  4. APDRE-10-21

我们的表格中有四种格式的策略。对于某些策略没有尾端“-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

【问题讨论】:

  • 似乎问题不在于最后 4 个字符,因为有时它是 10 个字符。也许你想要的只是前 5 个字符?

标签: sql-server sql-server-2008


【解决方案1】:

第 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 添加持久计算列。如果向它添加索引,查询将运行得更快。但是,插入会受到一些惩罚,因此需要权衡取舍。

【讨论】:

  • 我想你误会了。额外的字符在表中,而不是参数。
  • 最后四位'-000'也不一致,可能一直变化。有时可能是-012、-142、-001。在那种情况下,上面给出的代码将如何工作?我们如何修改它?
  • 请看我更新的答案。我想我在这里得到了大部分的角落案例:)
  • +1 单独用于创建函数。很多人认为将逻辑放在一个查询中是最好的方法,但是,即使是一次性的,将其保留在一个位置也会使修改保持一致。而且,对于这样的事情,它肯定会在其他地方出现(现在您有了一个带有单个维护点的首选方法)。
【解决方案2】:

这可能是您最好的选择。将策略编号匹配到请求参数的长度:

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

【讨论】:

    【解决方案3】:

    如果您只想在返回结果时剥离-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
    

    【讨论】:

      猜你喜欢
      • 2020-08-10
      • 1970-01-01
      • 2018-09-22
      • 2017-02-22
      • 2011-12-15
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      相关资源
      最近更新 更多