【问题标题】:select string between 3rd and 4th pipe delimiter在第 3 和第 4 个管道分隔符之间选择字符串
【发布时间】:2019-07-31 16:46:47
【问题描述】:

我有一列包含诸如

之类的值
Column
Asset|Class1|Category1|Group1|Account1
Expense|Class23|Category23|Group23|Account23

我想选择我的管道分隔符第 3 次和第 4 次出现之间的字符串,我该如何实现?

我尝试了 PARSENAME 和 charindex+stuff 函数,但它们有限制,例如最多 128 个字符。此外,我们的 SQL 服务器对正则表达式的支持有限。有什么想法吗?

SELECT REVERSE(PARSENAME(REVERSE(replace(LTRIM(Column), '|', '.')), 3))

我的选择需要返回: 第 1 组 第 23 组

【问题讨论】:

  • 不能在导入的时候修复数据,让它分到多列吗?
  • 是否可以修复设计并将这些值放在不同的列中?这是处理这个问题的最佳方式。
  • 什么版本的 SQL?如果是 2017 年,您可以只使用拆分字符串:docs.microsoft.com/en-us/sql/t-sql/functions/… 或创建您自己的函数版本。 stackoverflow.com/questions/6619810/…
  • 有大量的拆分字符串函数返回元素编号,允许您交叉应用字符串列,然后仅选择第三项,例如。

标签: sql sql-server regex substring charindex


【解决方案1】:

也许这会有所帮助

示例

Declare @YourTable table (ID int,[Column] varchar(max))
Insert Into @YourTable values
 (1,'Asset|Class1|Category1|Group1|Account1')
,(2,'Expense|Class23|Category23|Group23|Account23')

Select ID
      ,SomeValue = convert(xml,'<x>' + replace([Column],'|','</x><x>')+'</x>').value('/x[3]','varchar(100)')
 From @YourTable

退货

ID  SomeValue
1   Category1
2   Category23

【讨论】:

  • @user_KoBy 乐于助人
【解决方案2】:

如果你有 2016+,你也可以使用 STRING_SPLIT()

CREATE TABLE T(
  ID INT IDENTITY(1,1),
  Str VARCHAR(45)
);

INSERT INTO T(Str) VALUES 
('Asset|Class1|Category1|Group1|Account1'),
('Expense|Class23|Category23|Group23|Account23');

SELECT V Str
FROM (
       SELECT Value V,
              ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID) RN
       FROM T CROSS APPLY STRING_SPLIT(Str, '|')
     ) TT
WHERE RN = 3;

返回:

Str
---------
Category1
Category23

【讨论】:

  • 仅供参考,在 string_split() 的顺序上没有 GTD。 dba.stackexchange.com/questions/207274/… 完全披露,我还没有看到它失败,但话又说回来,我还没有被闪电击中。 :)
  • 不仅是 2016+,而且您的数据库也必须设置为兼容级别 130。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
相关资源
最近更新 更多