데이타의 유형은 대략 아래와 같이 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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 ) ; |