【问题标题】:Select substring between last set of chars from last从最后一组字符之间选择子字符串
【发布时间】:2020-09-10 11:08:27
【问题描述】:

我需要提取 2 个字符( "[" 和 "]" )之间的子字符串,但仅用于最后一次迭代。

这里的例子:

╔═════════════════════════════════════════════════════════════════════════════════════╦═══════════════════╗
║ Text                                                                                ║ Expected result   ║
╠═════════════════════════════════════════════════════════════════════════════════════╬═══════════════════╣
║ :OR1[253427815][11 Sep 2020][000685f383][Craft Labor ST][Standard]                  ║ Standard          ║
╠═════════════════════════════════════════════════════════════════════════════════════╬═══════════════════╣
║ :OR1[252348249][11 Sep 2020][0006ff85383][Craft Labor-Allowance][Skill Rate 7]      ║ Skill Rate 7      ║
╠═════════════════════════════════════════════════════════════════════════════════════╬═══════════════════╣
║ :OR1[2545528250][11 Sep 2020][00068ff5383][Craft Labor-Allowance][Attendance]       ║ Attendance        ║
╠═════════════════════════════════════════════════════════════════════════════════════╬═══════════════════╣
║ :OR1[2528454248][11 Sep 2020][000685383][Craft Labor-Allowance][Overtime]           ║ Overtime          ║
╠═════════════════════════════════════════════════════════════════════════════════════╬═══════════════════╣
║ :OR1[25254548247][11 Sep 2020][000685383][Craft Labor-Allowance][Weather Allowance] ║ Weather Allowance ║
╚═════════════════════════════════════════════════════════════════════════════════════╩═══════════════════╝

我尝试过使用子字符串和 charindex 的组合:

SELECT text, SUBSTRING( text, CHARINDEX( '][', text) + 2, 11 ) AS Expected_result

但我认为我应该这样做来搜索正确的,并且在找到“][”组合后只得到除最后一个“]”之外的所有内容

这有意义吗?选择右边的表格,直到找到第一个][然后得到除最后一个之外的所有内容]

【问题讨论】:

    标签: sql sql-server substring


    【解决方案1】:

    一种方法是:

    select replace(s.value, ']', '')
    from t cross apply
         string_split(t.text, '[') s
    where t.text like concat('%$[', s.value) escape '$';
    

    早期版本的替代方案:

    select t.*, replace(replace(v.str, '[', ''), ']', '')
    from t cross apply
         (values (stuff(t.text, 1, len(t.text) - charindex('[', reverse(t.text)), ''))) v(str);
    

    Here 是一个 dbfiddle。

    【讨论】:

    • 我在 string_split 上收到一个错误我有 sql-server 2014,你可能知道没有交叉应用的方法吗?只在选择中?
    • @Baldie47,这是可能的。请看我的回答。 STRING_SPLIT 已在 SQL Server 2016 中提供。
    • 谢谢@Gordon,虽然这对我不起作用,但我确定这是我的错,因为您的回答通常是正确的 :) 谢谢!
    • @Baldie47 。 . .有一个 dbfiddle 说明两者都有效。
    【解决方案2】:

    试试这个:

    SELECT REPLACE(RIGHT([text], CHARINDEX('[]', REVERSE([text]))-1), ']', '') AS Expected_result
    

    SqlFiddle

    【讨论】:

      猜你喜欢
      • 2013-12-31
      • 2019-12-20
      • 2015-10-17
      • 1970-01-01
      • 2015-05-11
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多