我对 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 正是我正在寻找的结果以及我需要的结果。希望有任何帮助,谢谢!
我尝试使用上面的解析,但很快意识到它可能不是正确的函数。我尝试使用子字符串,但也不明白。
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
提取这些位置之间的文本。
有很多不同的方法来给这只特定的猫剥皮,这里是一个 - 找到所需连字符的位置,然后简单地使用
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);
参见工作小提琴
有很多方法可以做到这一点。只要数据不是太大以至于每个连字符中间枢轴 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 | 猫猴 |