【问题标题】:t-sql How to use name column in patindext-sql 如何在 patindex 中使用名称列
【发布时间】:2022-08-07 22:48:27
【问题描述】:

你能帮我解决这样的问题吗: 我有这样的要求

with a as  
(
    select 1 num, 21 q, 49 b,  100 scq, 155 o, \'49 55;\'  b_ost
    union
    select 2 num, 21 q, 50 b,  101 scq, 155 o,\'50 54;49 55;\'
    union
    select 3 num, 21 q, 48 b,  156 scq, 254 o, \'48 98;50 54;49 55;\'
    union
    select 4 num, 21 q, 49 b,  156 scq, 254 o,  \'49 98;48 98;50 54;49 55;\'
    union
    select 5 num, 21 q, 48 b,  150 scq, 254 o,   \'48 104;49 98;48 98;50 54;49 55;\'
)
select *  ,  PATINDEX(\'%48 %\', b_ost), PATINDEX(b , b_ost)   from a

我需要在 b_ost 列中找到第一个位置列 b 如果我使用 PATINDEX(\'%48 %\', b_ost) 则位置计算正确。 但我需要使用 b 列而不是 \'%48 %\' ,如果我将使用 PATINDEX(b , b_ost) 则将 b 定位到 b_ost 列中将为 0。 通过变量解决是不合适的。 请告诉我如何解决我的问题?

    标签: tsql patindex


    【解决方案1】:

    假设我已经正确理解了您的要求,下面的代码将做到这一点:

    select * ,
           PATINDEX('%'+ CAST(b AS varchar)+'%', b_ost) from a
    

    它总是使用您提供的示例数据返回“1”,但我对您的示例进行了一些更改,它工作正常。

    【讨论】:

    • 您在数值后删除了一个空格字符。 +'%' 应该是 +'% '
    • @HABO,你确定吗?每次返回 0 为 +'% '+' %' 确实给出了有效的结果。
    • 我的错。 OP 的原始模式是'%48 %',所以它只匹配每对分号 (;) 分隔值中的第一个,所以模式应该有+' %'。他们的样本数据没有任何有趣的行,即匹配没有出现在字符串开头或b42 并且字符串以'42999 ...' 开头的行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多