2017-11-24 7 views
2

を文字列に同じ文字のそれぞれの位置を検索すると、私のデータは、私はそれぞれの「H」の位置が表示されている出力の下に取得するSQLクエリを書きたいSQLクエリを通じて以下

Year  Month  Holiday list 
---------------------------------------------------------- 
2007  1   WWHHWWWWWHHWWWWWHHWWWWWHHWWWWWH 
2008  4   HWWWWWHHWWWWWHHWWWWWHHWWWWWHHWW 

を設定しています。

Year  Month  Holiday list 
----------------------------------------------------- 
2007  1   3 4 10 11 18 19 25 26 31 
2008  4   1 7 8 14 15 21 22 28 29 

OracleのINSTR関数は、最初の文字の位置を返します。だから、私はそれを使用することはできません。

私はFunctionを記述してHoliday List列の値を渡すことができました。文字列をループし、 それぞれの "H"の位置を見つけます。しかし、私は単純なSQLの選択クエリを通じてこれを達成したい。

OracleデータベースのSQLクエリを通じて、文字列内の同じ文字の各位置を見つける方法はありますか?

+1

私は、ベースのOracleの文字列関数、または正規表現関数もこれを行うことはできないと思います。私はあなたが休日リストの文字列のすべての文字を繰り返し処理できるUDFが必要だと思います。データベースはこの種の問題のための最良のツールではありません。 –

答えて

4

このようなものがあります。 INSTR関数と階層クエリを使用して文字列を調べ、LISTAGG解析関数を使用して結果を連結することができます。

WITH data AS (
    SELECT 2007 year, 1 month, 'WWHHWWWWWHHWWWWWHHWWWWWHHWWWWWH' holiday_list FROM DUAL 
    UNION 
    SELECT 2008 year, 4 month, 'HWWWWWHHWWWWWHHWWWWWHHWWWWWHHWW' holiday_list FROM DUAL) 
SELECT year, month, (SELECT LISTAGG(INSTR(holiday_list,'H',1,LEVEL),' ') WITHIN GROUP (ORDER BY LEVEL) 
FROM DUAL 
CONNECT BY LEVEL < INSTR(holiday_list,'H',1,LEVEL)) S 
FROM data; 
0

さてあなたは、これはあなたがこのリストを転置しようとすることができH.との日のリストを与えるhere

SELECT id, INSTR(some, 'H', 1, c.no) AS Pos 
FROM tst CROSS JOIN consecutive c 
WHERE INSTR(some, 'H', 1, c.no) > 0 

dbfiddleを参照して、リストを取得することができます。しかし、そこには意図的なCROSS JOINがあるので、データ内のすべての行について、このステートメントで最大31行を取得することに注意してください。 Tim Biegeleisen氏によると、このためにUDFを使うほうが良いかもしれません。

関連する問題