gpt4 book ai didi

sql-server-2008 - 如何在 SQL Server 2008 中对字符串值进行子串

转载 作者:行者123 更新时间:2023-12-04 07:03:58 30 4
gpt4 key购买 nike

我有以下字符串

KLPI_2012_CBBE2_E_12704_2012-09-21_13_59_52
IYT_2012_CBBI1_S_66_2012-09-21_15_28_53

我想提取第一个之后的所有内容 _ & 5号之前 _
前任:
2012_CBBE2_E_12704 
2012_CBBI1_S_66

最佳答案

方法 1. 嵌套 CHARINDEX 调用。

使用 CHARINDEX('_', stringvalue)获取第一个 _ 的位置在 stringvalue .您可以指导CHARINDEX从某个位置开始搜索,如果您将该位置作为第三个参数传递:

CHARINDEX(`_`, stringvalue, startpos)

现在,如果起始位置将是 CHARINDEX('_', stringvalue)+1 的结果,即像这样:
CHARINDEX(`_`, stringvalue, CHARINDEX(`_`, stringvalue) + 1)

那么这会给你第二个 _的位置。所以,要找到第五个 _ ,您需要嵌套 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
;

方法二、人物拆分+排名。
  • 使用 numbers table将每个字符串拆分为单个字符,沿途拉动它们的位置。
  • 对字符串中每个字符的出现进行排名。
  • 得到两个子集:

    1) 用字符 _和1的排名;

    2) 用字符_和 5 的排名。

    将这些子集相互连接起来。
  • 使用_的对应位置#1 和 _ #5 类似于方法 1 来获取子字符串。

  • 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
    ;

    注意:这两种方法都假设每个 aStringColumn value 确实至少有 5 个下划线字符。

    关于sql-server-2008 - 如何在 SQL Server 2008 中对字符串值进行子串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13490301/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com