如何抓取连字符之间的数据?

问题描述 投票:0回答:3

我对 SQL 世界和使用 Microsoft SQL Server Management Studio 相当陌生。我可以操作一些给我的查询示例,但当我不理解这些功能时就不行。我正在尝试获取连字符之间的数据。例如:

EXAMPLE-ABC-1234-XYZZ-DE-LMNO.24XX4
EXAMPLE-CBA-1234-XYZZ-DE-LMNO.24XX4

我需要能够抓取数据 ABC-1234 但这个长度不是固定的。有时,它会是 ABC-123。修复的是我需要第一个连字符之后和第三个连字符之前的数据。

我收到一个查询,取出 24XX4。

SELECT code,REVERSE(PARSENAME(REPLACE(reverse([Code]), '.', '.'), 1))  AS Example1,
         REVERSE(PARSENAME(REPLACE(REVERSE([Code]), '-', '-'), 2)) AS Example2
 
    from [table].[database].[example] 
where code in ('EXAMPLE-ABC-1234-XYZZ-DE-LMNO.24XX4, 'EXAMPLE-CBA-1234-XYZZ-DE-LMNO.24XX4')

但我不太明白它是如何做到这一点或如何对我有利的。或者,如果 parsename 正是我正在寻找的结果以及我需要的结果。希望有任何帮助,谢谢!

我尝试使用上面的解析,但很快意识到它可能不是正确的函数。我尝试使用子字符串,但也不明白。

sql sql-server database parsing
3个回答
0
投票
SELECT
    code,
    SUBSTRING(
        code,
        CHARINDEX('-', code) + 1,
        CHARINDEX('-', code, CHARINDEX('-', code, CHARINDEX('-', code) + 1) + 1) - CHARINDEX('-', code) - 1
    ) AS ExtractedText
FROM
    [table].[database].[example]
WHERE
    code IN ('EXAMPLE-ABC-1234-XYZZ-DE-LMNO.24XX4', 'EXAMPLE-CBA-1234-XYZZ-DE-LMNO.24XX4')

使用

CHARINDEX

查找第一个连字符的位置

找到第三个连字符的位置。由于

CHARINDEX
给出了位置 第一次出现某个字符时,每次在前一个连字符之后开始搜索时,您都需要多次调用它。

使用

SUBSTRING
提取这些位置之间的文本。


0
投票

有很多不同的方法来给这只特定的猫剥皮,这里是一个 - 找到所需连字符的位置,然后简单地使用

stuff
删除不需要的部分:

select string, Stuff(s.v, p3.p - p1.p, 100, '') NewString
from t
cross apply(select CharIndex('-', string))p1(p)
cross apply(select CharIndex('-', string, p1.p + 1))p2(p)
cross apply(select CharIndex('-', string, p2.p + 1))p3(p)
cross apply(select Stuff(string, 1, p1.p, ''))s(v);

参见工作小提琴


0
投票

有很多方法可以做到这一点。只要数据不是太大以至于每个连字符中间枢轴 1 行将是令人望而却步的,我就偏向于此。索引匹配让人眼花缭乱。

基本原理 - 使用内置 string_split 将原始字符串中的每个连字符分成一行。序数值对应于标记的位置。然后使用您喜欢的任何分组串联方法。当它小于 5 左右时,我喜欢 max(case ...)。

create table some_test_data 
  (
    id int,
    original_delimited_string varchar(255)
  );

insert into some_test_data values (1, 'Apple-Pear-Banana-Orange-Kiwi');
insert into some_test_data values (2, 'Dog-Cat-Monkey-Deer-Lion');

with row_explode as (
SELECT *
FROM some_test_data
    CROSS APPLY STRING_SPLIT(original_delimited_string, '-', 1)
)
select id,
       max(case when ordinal = 2 then value else '' end) + '-' +
       max(case when ordinal = 3 then value else '' end)
  from row_explode
 group
    by id;
id (无栏名)
1 梨香蕉
2 猫猴
© www.soinside.com 2019 - 2024. All rights reserved.