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

1-3,5,10-15,20のような式に数字が含まれているかどうかを検索します

    REGEXP_SUBSTR関数と階層クエリを使用してSQLでこれをすべて行うことができます:

    with list_of_ids as (
    select regexp_substr(a, '[[:digit:]]+',1, 1) as lot1
         , nvl( regexp_substr(a, '(-)([[:digit:]]+)',1, 1, 'i', '2')
              , regexp_substr(a, '[[:digit:]]+',1, 1)) as lot2
      from (select regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) as a
              from dual
           connect by regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) is not null
                   )
           )
    select a.*
      from products a
      join list_of_ids b
        on a.lot between b.lot1 and b.lot2
    

    ただし、データベースを適切に正規化することが最善の方法であることを強調する必要があります。このソリューションは拡張性が低く、非常に不必要な量の作業を行う可能性があります。

    これは次のように機能します:

    まず、データをカンマで分割します:

    SQL>  select regexp_substr('1-3,5,10-15,20', '[^,]+', 1, level) as a
      2     from dual
      3  connect by regexp_substr('1-3,5,10-15,20', '[^,]+', 1, level) is not null
      4          ;
    
    A
    --------------
    1-3
    5
    10-15
    20
    

    次に、それをハイフンで分割して、最終的にテーブルに結合する前に、BETWEENで使用する最小および最大のロットを提供します。 NVLは、常に最大値があることを保証するためにあります。

    SQL> select regexp_substr(a, '[[:digit:]]+',1, 1) as lot1
      2       , nvl( regexp_substr(a, '(-)([[:digit:]]+)',1, 1, 'i', '2')
      3             , regexp_substr(a, '[[:digit:]]+',1, 1)) as lot2
      4    from (select regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) as a
      5            from dual
      6         connect by regexp_substr('1-3,5,10-15,20' , '[^,]+', 1, level) is not null
      7                 )
      8         ;
    
    LOT1           LOT2
    -------------- --------------
    1              3
    5              5
    10             15
    20             20
    
    SQL>
    

    これが完全なクエリで動作するSQLフィドルです。



    1. Node.jsを介してPostgresに接続する方法

    2. SQL Serverで行レベルのロックを強制することは可能ですか?

    3. データ型の選択はどの程度の影響を与える可能性がありますか?

    4. Group By句を持つ—eleinのGeneralBits