sql >> データベース >  >> RDS >> Oracle

SQLServerのREGEXP_SUBSTRを置き換えます

    SQLフィドル

    MS SQLServer2014スキーマのセットアップ

    CREATE TABLE table_name ( name VARCHAR(50) );
    INSERT INTO table_name
    SELECT 'AE 344592001H 6186694' UNION ALL
    SELECT 'AE_161038002_6044777' UNION ALL
    SELECT 'BC_VIVS_HNB011A_1WAM' UNION ALL
    SELECT 'BC_56230A_30SP' UNION ALL
    SELECT 'CG_3334902_NETWK_ ACTLM_3334912' UNION ALL
    SELECT 'CG_3334574_HMO1_CORACT_3334575' UNION ALL
    SELECT 'CG_3207160_POSC_1502AH_3207161' UNION ALL
    SELECT 'UH_141015_RHM' UNION ALL
    SELECT 'UH_127757_RIV' UNION ALL
    SELECT 'UH 523725 RIV' UNION ALL
    SELECT 'BS_W0055785_C500_M0005672';
    

    クエリ1

    WITH Names ( lvl, name, remaining, idx ) AS (
      SELECT 1,
             name,
             name,
             CHARINDEX( '_', name )
      FROM   table_name
      UNION ALL
      SELECT lvl+1,
             name,
             SUBSTRING(remaining,idx+1,LEN(remaining)-idx),
             CASE WHEN CHARINDEX( '_', remaining, idx+1 ) = 0
                  THEN 0
                  ELSE CHARINDEX( '_', remaining, idx+1 ) - idx
                  END
      FROM   Names
      WHERE  idx > 0
    )
    SELECT Name,
           MAX( CASE WHEN lvl = 3 AND ( Name LIKE 'CG%' OR idx = 0 ) THEN remaining
                     WHEN lvl = 3 THEN SUBSTRING( remaining, 1, idx - 1 )
                     END ) AS OPT,
           MAX( CASE WHEN lvl = 2 AND ( Name LIKE 'CG%' OR idx = 0 ) THEN remaining
                     WHEN lvl = 2 THEN SUBSTRING( remaining, 1, idx - 1 )
                     END ) AS Name2
    FROM   Names
    GROUP BY Name
    

    結果

    |                            Name |                  OPT |                        Name2 |
    |---------------------------------|----------------------|------------------------------|
    |           AE 344592001H 6186694 |               (null) |                       (null) |
    |            AE_161038002_6044777 |              6044777 |                    161038002 |
    |                  BC_56230A_30SP |                 30SP |                       56230A |
    |            BC_VIVS_HNB011A_1WAM |              HNB011A |                         VIVS |
    |       BS_W0055785_C500_M0005672 |                 C500 |                     W0055785 |
    |  CG_3207160_POSC_1502AH_3207161 |  POSC_1502AH_3207161 |  3207160_POSC_1502AH_3207161 |
    |  CG_3334574_HMO1_CORACT_3334575 |  HMO1_CORACT_3334575 |  3334574_HMO1_CORACT_3334575 |
    | CG_3334902_NETWK_ ACTLM_3334912 | NETWK_ ACTLM_3334912 | 3334902_NETWK_ ACTLM_3334912 |
    |                   UH 523725 RIV |               (null) |                       (null) |
    |                   UH_127757_RIV |                  RIV |                       127757 |
    |                   UH_141015_RHM |                  RHM |                       141015 |
    

    クエリ2

    CHARINDEX( expressionToFind, expressionToSerach[, startIndex] ) _のインスタンスを見つけるために使用できます 一言で言えば。

    • CHARINDEX( '_', name ) _の最初のインスタンスのインデックスを検索します 。
    • CHARINDEX( '_', name, CHARINDEX( '_', name ) + 1 ) _の2番目のインスタンスのインデックスを検索します または0を返します _が2つない場合 文字。
    • CHARINDEX( '_', name, CHARINDEX( '_', name, CHARINDEX( '_', name ) + 1 ) + 1) _の3番目のインスタンスのインデックスを検索します または0を返します _が3つない場合 文字。

    これを内部選択にネストすると、適切なSUBSTRINGを取得するために使用できます。 s次のような外部選択:

    SELECT name,
           CASE WHEN idx2 > idx1 AND ( Name LIKE 'CG%' OR idx3 = 0 )THEN SUBSTRING( name, idx2 + 1, LEN( name ) )
                WHEN idx3 > idx2 THEN SUBSTRING( name, idx2 + 1, idx3 - idx2 - 1 )
                END AS OPT,
           CASE WHEN name LIKE 'CG%' THEN SUBSTRING( name, idx1 + 1, LEN( name ) )
                WHEN idx2 > idx1 THEN SUBSTRING( name, idx1 + 1, idx2 - idx1 - 1 )
                END AS Name2
    FROM   (
      SELECT name,
             CHARINDEX( '_', name ) AS idx1,
             CHARINDEX( '_', name, CHARINDEX( '_', name ) + 1 ) AS idx2,
             CHARINDEX( '_', name, CHARINDEX( '_', name, CHARINDEX( '_', name ) + 1 ) + 1 ) AS idx3
      FROM   table_name
    ) t
    

    結果

    |                            name |                  OPT |                        Name2 |
    |---------------------------------|----------------------|------------------------------|
    |           AE 344592001H 6186694 |               (null) |                       (null) |
    |            AE_161038002_6044777 |              6044777 |                    161038002 |
    |            BC_VIVS_HNB011A_1WAM |              HNB011A |                         VIVS |
    |                  BC_56230A_30SP |                 30SP |                       56230A |
    | CG_3334902_NETWK_ ACTLM_3334912 | NETWK_ ACTLM_3334912 | 3334902_NETWK_ ACTLM_3334912 |
    |  CG_3334574_HMO1_CORACT_3334575 |  HMO1_CORACT_3334575 |  3334574_HMO1_CORACT_3334575 |
    |  CG_3207160_POSC_1502AH_3207161 |  POSC_1502AH_3207161 |  3207160_POSC_1502AH_3207161 |
    |                   UH_141015_RHM |                  RHM |                       141015 |
    |                   UH_127757_RIV |                  RIV |                       127757 |
    |                   UH 523725 RIV |               (null) |                       (null) |
    |       BS_W0055785_C500_M0005672 |                 C500 |                     W0055785 |
    



    1. sp_renameプロシージャを使用したインデックスの名前変更

    2. .NETプロジェクトをアンマネージドからマネージドODP.NETアセンブリに切り替える際の問題

    3. postgresqlコンソールでは正常に見えるのにクエリがcsvファイルに保存されない理由

    4. MicrosoftAccessのアプリケーション用のVisualBasic