메뉴에 대한 파싱 문의 0 4 2,847

by 마늘장아찌 [SQL Query] instr substr [2014.07.31 09:12:35]


데이타의 유형은 대략 아래와 같이 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

by 마농 [2014.07.31 10:10:15]

첫번째 행은 구분자인 '/' 를 포함하고 있네요?

예시자료엔 없지만 문자열에 숫자를 포함하는건 없나요?

이런식으로 데이터 자체에 구분자가 포함되어 있다면 곤란한데요...


by 마늘장아찌 [2014.07.31 13:24:57]

네, 1/ case 와 구분이 어렵겠네요... /가 포함입니다.

숫자 포함은 없습니다.(확인) /는 있네요.

이기종간 인터페이스 자료라 어찌해볼수가 없습니다.

완벽할순 없고 최대한 가독률을 올리는 방향으로 하려구요...


by 마농 [2014.07.31 11:03:11]
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
        )
;

 


by 마늘장아찌 [2014.07.31 13:34:52]

저는 substr(), instr() 으로 어찌 해볼 요량이었는데 생각보다 잘 안되더라구요...

내용은 제가 다 이해는 안됩니다만 ^^

case by case별로 처리를 하시는걸로 보여지구요...

원하는 답에 100% 결과가 나와 줍니다.

이결과를 가지고 menu code를 Lookup 처리하면될거 같아요

정말 감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입