7

私は次の文字列を持っています

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
4

3 に答える 3

8

方法 1. ネストされた CHARINDEX 呼び出し。

の最初の位置を取得するために使用します。その位置を 3 番目の引数として渡すと、特定の位置から検索を開始するように指示できます。CHARINDEX('_', stringvalue)_stringvalueCHARINDEX

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
;

方法2.キャラクター分割+ランキング。

  1. 数値表を使用して、すべての文字列を 1 文字に分割し、途中で位置を引きます。

  2. 文字列内のすべての文字の出現をランク付けします。

  3. 2 つのサブセットを取得します。

    1) キャラクター_とランキングが 1 の場合。

    2) キャラクター_とランキングが 5 の場合。

    これらのサブセットを互いに結合します。

  4. 方法 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 つのアンダースコア文字があることを前提としています。

于 2012-11-21T18:42:36.750 に答える
5

SUBSTRING関数を使用して、特定の文字列から部分文字列を抽出できます。

SELECT SUBSTRING('KLPI_2012_CBBE2_E_12704_2012-09-21_13_59_52', 6, 18);
于 2012-11-21T09:44:57.777 に答える
1

それは巧妙にSubStringという名前です

のように

Select Substring('KLPI_2012_CBBE2_E_12704_2012-09-21_13_59_52',6,18)

文字列内で検索する場合は、CharIndexが役立ちます。これをSQLで実行してもよろしいですか。これは面倒で遅くなり、UDFを作成するか、CLRを使用して実際に使用する必要があります。

于 2012-11-21T09:47:13.633 に答える