오라클 특정문자열이 왔을 때 모두 바꾸는게..될런지..문의드립니다. 1 12 1,284

by 많이부족합니다 [2017.09.06 10:37:23]


A라는 컬럼에 숫자를 제외한 . (점)이라던지 한글이라던지 영문 (괄호라던지 ...

즉, 숫자를 제외한 어떤값이 올경우에는 '사용기간이아닙니다' << 이문구로 변환하고 싶습니다.

이런게 될런지요?;;; 

1992.01.31(30일간)    << 이런문구가 있다면 즉, 이문구는 숫자외에 . (쩜도있고, 괄호도 있고 한글도있으니)

'사용기간이아닙니다'  << 이런식으로 뿌려주고 싶습니다.

 

by 우리집아찌 [2017.09.06 11:03:09]
WITH T AS (
SELECT '1992.01.31(30일간)' TXT FROM DUAL UNION ALL
SELECT '19920131' TXT FROM DUAL
)

SELECT CASE WHEN REGEXP_COUNT(TXT,'[^0-9]')  >= 1 THEN '사용기간이아닙니다' 
            ELSE TXT END TXT 
  FROM T

 


by 박군two [2017.09.06 11:05:11]

우리집아찌님 

이렇게 되면 '1992013130' 요런경우 날짜형태보다 긴 숫자.. 는 판단안되지 않을까요


by 박군two [2017.09.06 11:12:27]
-- 데이터가 '19920131' 와 같이 8자리 숫자로 입력되어야 한다는 전체하에
WITH T AS (
    SELECT '1992.01.31(30일간)' STR FROM DUAL UNION ALL
    SELECT '1992.01.31'             FROM DUAL UNION ALL
    SELECT '1992013130'             FROM DUAL UNION ALL
    SELECT '19920131'               FROM DUAL
)
SELECT T.STR, 
       CASE WHEN LENGTH(T.STR) > 8                      THEN '사용기간이아닙니다'
            WHEN REGEXP_REPLACE(T.STR, '[0-9]') IS NULL THEN T.STR
       END RESULT   
FROM   T;

 


by 우리집아찌 [2017.09.06 11:14:30]

위의 날짜의 정합성이 맞질 않죠

19920231같은 것도 못걸러냅니다.

날짜 정합성까지 맞추시려면

http://scidb.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4%EC%97%90%EC%84%9C-isnumber-isdate-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

참조하시면 됩니다. 


by 우리집아찌 [2017.09.06 11:16:10]

윤년같은건 걸러내기 힘들어서 그냥 쿼리로는 힘들겁니다.

 

 


by 박군two [2017.09.06 11:26:10]

아.. 그렇군요..

TO_DATE 에러가 발생하는걸로 날짜 정합성을 체크해야겠네요.

또 배워갑니다 ㅎㅎ 감사합니다.


by 마농 [2017.09.06 13:16:37]
WITH t AS
(
SELECT '1992.01.31(30일간)' a FROM dual
UNION ALL SELECT '1234' FROM dual
UNION ALL SELECT '19920131' FROM dual
UNION ALL SELECT '19920229' FROM dual
UNION ALL SELECT '1992.02.29' FROM dual
UNION ALL SELECT '19930229' FROM dual
UNION ALL SELECT '12가나다34' FROM dual
)
SELECT a
     , CASE WHEN REGEXP_LIKE(a, '[^0-9]') OR TO_NUMBER(column_value) = 0
            THEN '사용기간이아닙니다'
            ELSE a END x
  FROM t
     , XMLTABLE('if (. castable as xs:date) then 1 else 0' PASSING a)
;

 


by 우리집아찌 [2017.09.07 18:11:15]

신기한거 많이 아시네요 ㅎㅎ


by 박군two [2017.09.06 13:28:37]
WITH T AS (
    SELECT '1992.01.31(30일간)' STR FROM DUAL UNION ALL
    SELECT '1992.01.31'             FROM DUAL UNION ALL
    SELECT '1992013130'             FROM DUAL UNION ALL
    SELECT '19920136'               FROM DUAL UNION ALL
    SELECT '07-01-1992'             FROM DUAL UNION ALL
    SELECT '1993-05-25'             FROM DUAL UNION ALL
    SELECT '19930525'               FROM DUAL UNION ALL
    SELECT '20170229'               FROM DUAL
)
SELECT STR, 
       CASE WHEN STR = (CASE WHEN REGEXP_SUBSTR(STR,'^[[:digit:]]{8}$') IS NOT NULL 
                                  THEN TO_CHAR(ADD_MONTHS(TO_DATE('19000101','YYYYMMDD'), (TO_NUMBER(SUBSTR(STR,1,4))-1900)*12 + TO_NUMBER(SUBSTR(STR,5,2))-1)
                                       +TO_NUMBER(SUBSTR(STR,7,2))-1, 'YYYYMMDD') ELSE NULL END) THEN STR
            ELSE '사용기간이아닙니다'
       END
FROM   T;

by 많이부족합니다 [2017.09.07 17:08:32]

답변주신 모든분들 고개숙여 감사 인사 드립니다.

많은 도움이 되었습니다.


by 우리집아찌 [2017.09.07 18:10:42]
/* 억지로 만들자고 하면*/
WITH T AS (
SELECT '1992.01.31(30일간)' TXT FROM DUAL UNION ALL
SELECT '20162029' TXT FROM DUAL  UNION ALL
SELECT '20160229' TXT FROM DUAL  
)
 
SELECT TXT
     , CASE WHEN REGEXP_COUNT(TXT,'[^0-9]')  >= 1 THEN '사용기간이아닙니다'
            WHEN REGEXP_COUNT(TXT,'[0-9]{4}[0-1][0-9][0-3][0-9]') = 0  THEN '사용기간이아닙니다'
            WHEN SUBSTR(TXT,7,2) <= TO_CHAR(LAST_DAY(TO_DATE(SUBSTR(TXT,1,6),'YYYYMM')),'DD')  THEN TXT
       END TXT 
  FROM T

 


by jkson [2017.09.07 18:31:41]

20160239, 20161330 ㅋㅋ

WITH T AS (
SELECT '1992.01.31(30일간)' TXT FROM DUAL UNION ALL
SELECT '20162029' TXT FROM DUAL  UNION ALL
SELECT '20162039' TXT FROM DUAL  UNION ALL
SELECT '20161330' TXT FROM DUAL  UNION ALL
SELECT '20160229' TXT FROM DUAL  
)
SELECT TXT
     , CASE WHEN REGEXP_COUNT(TXT,'^[0-9]{4}((0[1-9])|(1[1-2]))(([0-2][0-9])|(3[0-1]))$') = 0  THEN '사용기간이아닙니다'
            WHEN SUBSTR(TXT,7,2) <= TO_CHAR(LAST_DAY(TO_DATE(SUBSTR(TXT,1,6),'YYYYMM')),'DD')  THEN TXT
            ELSE '사용기간이아닙니다'
       END TXT
  FROM T

 

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