데이타의 유형은 대략 아래와 같이 9가지입니다.
총 5개 메뉴까지 받을수 있는데 아래의 경우는 첫번째 로우의 max가 4까지 간 경우이구요,
파라미터를 1로 던지게 되면 첫번째 메뉴의 case에서 파싱이 되어 노란색 부분이 추출되었으면 합니다.
즉 1로 던지면 각각의 1ST 또는 1 또는 / 의 메뉴명이 추출되어야 하고 4를 던졌을 경우는
첫번째 로우의 HOT DOG만이 나오면 되겠습니다.
전체 경우의 수를 다 cover하지 못한다면 최소한 1ST, 2ND형태에 대해서만이라도 나와줬으면 합니다.
감사합니다.
WITH t AS
(SELECT '1ST FRIED RICE/EGG X 2ND FRIED RICE/EGG X 3RD SPAGHETTI X 4TH HOT DOG' CONTENTS FROM dual UNION ALL
SELECT '1ST MENU HUMBURGER AND 2ND SPAGHETTI' FROM dual UNION ALL
SELECT 'HAMBURGER' FROM dual UNION ALL
SELECT 'PIZZA/HAMBURGER' FROM dual UNION ALL
SELECT '1STSPAGHETTI/ 2ND PIZZA' FROM dual UNION ALL
SELECT '1ST PIZZA N 2NDSPAGHETTI' FROM dual UNION ALL
SELECT '1SPAGHETTI/2HAMBURGER' FROM dual UNION ALL
SELECT '1HOT DOG' FROM dual UNION ALL
SELECT '1/HOTDOG 2/HAMBURGER' FROM dual)
SELECT *
FROM t
WITH t AS ( SELECT '1ST FRIED RICE/EGG X 2ND FRIED RICE/EGG X 3RD SPAGHETTI X 4TH HOT DOG' contents FROM dual UNION ALL SELECT '1ST MENU HUMBURGER AND 2ND SPAGHETTI' FROM dual UNION ALL SELECT 'HAMBURGER' FROM dual UNION ALL SELECT 'PIZZA/HAMBURGER' FROM dual UNION ALL SELECT '1STSPAGHETTI/ 2ND PIZZA' FROM dual UNION ALL SELECT '1ST PIZZA N 2NDSPAGHETTI' FROM dual UNION ALL SELECT '1SPAGHETTI/2HAMBURGER' FROM dual UNION ALL SELECT '1HOT DOG' FROM dual UNION ALL SELECT '1/HOTDOG 2/HAMBURGER' FROM dual ) SELECT contents --, x , REGEXP_SUBSTR(x, '[^@]+', 1, 1) v1 , REGEXP_SUBSTR(x, '[^@]+', 1, 2) v2 , REGEXP_SUBSTR(x, '[^@]+', 1, 3) v3 , REGEXP_SUBSTR(x, '[^@]+', 1, 4) v4 , REGEXP_SUBSTR(x, '[^@]+', 1, 5) v5 FROM (SELECT contents , REGEXP_REPLACE( REGEXP_REPLACE( '@'|| CASE WHEN REGEXP_LIKE(contents, '1ST|2ND|3RD|4TH|5TH') THEN REGEXP_REPLACE(contents, '1ST|2ND|3RD|4TH|5TH', '@') WHEN REGEXP_LIKE(contents, '(^|/| )[1-5](/| )?') THEN REGEXP_REPLACE(contents, '(^|/| )[1-5](/| )?', '@') ELSE REPLACE(contents, '/', '@') END || '@' , '( )+(.|AND)( )*@', '@') , '( |/)*@( |/)*', '@') AS x FROM t ) ;