私は次の文字列を持っています
KLPI_2012_CBBE2_E_12704_2012-09-21_13_59_52
IYT_2012_CBBI1_S_66_2012-09-21_15_28_53
_
1日目以降、5日目前まで全て抽出したい_
元:
2012_CBBE2_E_12704
2012_CBBI1_S_66
私は次の文字列を持っています
KLPI_2012_CBBE2_E_12704_2012-09-21_13_59_52
IYT_2012_CBBI1_S_66_2012-09-21_15_28_53
_
1日目以降、5日目前まで全て抽出したい_
元:
2012_CBBE2_E_12704
2012_CBBI1_S_66
の最初の位置を取得するために使用します。その位置を 3 番目の引数として渡すと、特定の位置から検索を開始するように指示できます。CHARINDEX('_', stringvalue)
_
stringvalue
CHARINDEX
CHARINDEX(`_`, stringvalue, startpos)
ここで、開始位置が の結果になる場合、つまり次のようになります。CHARINDEX('_', stringvalue)+1
CHARINDEX(`_`, stringvalue, CHARINDEX(`_`, stringvalue) + 1)
次に、2番目_
の位置が得られます。したがって、5 番目の を見つけるには、さらに 3 回_
ネストする必要があります。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
;
数値表を使用して、すべての文字列を 1 文字に分割し、途中で位置を引きます。
文字列内のすべての文字の出現をランク付けします。
2 つのサブセットを取得します。
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
;
aStringColumn
注: どちらの方法も、すべての値に少なくとも 5 つのアンダースコア文字があることを前提としています。
SUBSTRING関数を使用して、特定の文字列から部分文字列を抽出できます。
SELECT SUBSTRING('KLPI_2012_CBBE2_E_12704_2012-09-21_13_59_52', 6, 18);
それは巧妙にSubStringという名前です
のように
Select Substring('KLPI_2012_CBBE2_E_12704_2012-09-21_13_59_52',6,18)
文字列内で検索する場合は、CharIndexが役立ちます。これをSQLで実行してもよろしいですか。これは面倒で遅くなり、UDFを作成するか、CLRを使用して実際に使用する必要があります。