我有以下字符串
KLPI_2012_CBBE2_E_12704_2012-09-21_13_59_52
IYT_2012_CBBI1_S_66_2012-09-21_15_28_53
Run Code Online (Sandbox Code Playgroud)
我希望在第一次_和第五次之后提取所有内容_
例如:
2012_CBBE2_E_12704
2012_CBBI1_S_66
Run Code Online (Sandbox Code Playgroud)
使用获得第一的位置在.如果您将该位置作为第三个参数传递,您可以指示从某个位置开始搜索:CHARINDEX('_', stringvalue)_stringvalueCHARINDEX
CHARINDEX(`_`, stringvalue, startpos)
Run Code Online (Sandbox Code Playgroud)
现在,如果起始位置将是结果,即如下:CHARINDEX('_', stringvalue)+1
CHARINDEX(`_`, stringvalue, CHARINDEX(`_`, stringvalue) + 1)
Run Code Online (Sandbox Code Playgroud)
然后那会给你第二个_位置.所以,要找到第五个_,你需要再嵌套CHARINDEX三次:
WITH aTable AS (
SELECT
*
FROM
(VALUES
('KLPI_2012_CBBE2_E_12704_2012-09-21_13_59_52'),
('IYT_2012_CBBI1_S_66_2012-09-21_15_28_53')
) AS v (aStringColumn)
),
positions AS (
SELECT
aStringColumn,
Underscore1 = CHARINDEX('_', aStringColumn),
Underscore5 = CHARINDEX('_',
aStringColumn,
CHARINDEX('_',
aStringColumn,
CHARINDEX('_',
aStringColumn,
CHARINDEX('_',
aStringColumn,
CHARINDEX('_',
aStringColumn
) + 1
) + 1
) + 1
) + 1
)
FROM
aTable
)
SELECT
aSubstring = SUBSTRING(aStringColumn,
Underscore1 + 1,
Underscore5 - Underscore1 - 1
)
FROM
positions
;
Run Code Online (Sandbox Code Playgroud)
使用数字表将每个字符串拆分为单个字符,沿途拉出它们的位置.
对字符串中每个字符的出现进行排名.
获取两个子集:
1)具有1的字符_和排名;
2)具有5的性格_和排名.
相互加入这些子集.
类似于方法1,使用_#1和_#5 的相应位置来获取子串.
WITH aTable AS (
SELECT
*
FROM
(VALUES
('KLPI_2012_CBBE2_E_12704_2012-09-21_13_59_52'),
('IYT_2012_CBBI1_S_66_2012-09-21_15_28_53')
) AS v (aStringColumn)
),
split AS (
SELECT
t.aStringColumn,
aChar = SUBSTRING(t.aStringColumn, n.Number, 1),
Position = n.Number
FROM
aTable t
INNER JOIN Numbers n
ON n.Number BETWEEN 1 AND LEN(t.aStringColumn)
),
ranked AS (
SELECT
*,
rnk = ROW_NUMBER() OVER (PARTITION BY aStringColumn, aChar ORDER BY Position)
FROM
split
WHERE
aChar = '_'
)
SELECT
aSubstring = SUBSTRING(first.aStringColumn,
first.Position + 1,
fifth.Position - first.Position - 1
)
FROM
ranked first
INNER JOIN ranked fifth
ON first.aStringColumn = fifth.aStringColumn
WHERE
first.rnk = 1
AND fifth.rnk = 5
;
Run Code Online (Sandbox Code Playgroud)
注意:两种方法都假设每个aStringColumn值都至少有5个下划线字符.
您可以使用SUBSTRING函数从给定字符串中提取子字符串.
SELECT SUBSTRING('KLPI_2012_CBBE2_E_12704_2012-09-21_13_59_52', 6, 18);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66196 次 |
| 最近记录: |