database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41575 게시물 읽기
No. 41575
sql 문제 ..도와주세요...ㅜㅜ
작성자
도와주세요
작성일
2018-05-28 14:50
조회수
5,602

항상 많은 도움 받고 있는 1인 입니다.

 

다름이 아니라..

 

col

-----------

a1 varchar2(20) --->3.4

b1 varchar2(20) --->7.6

 

 

 

col

--------------

c1 varchar(20) ---->3

 

select

CASE WHEN A.a1 < C.c1 AND (A.a1 <> ' ' OR A.a1 <> '0') THEN ' '

WHEN A.b1 > C.c1 AND (A.b1 <> ' ' OR A.b1 <> '0') THEN ' '

ELSE 'OUT' END AS RESULT;

 

이렇게 됐을 때... 'OUT' 이 결과로 나와야 하는데, 아무 값도 없는 공백이 나옵니다.

이게 아마도 형 변환 문제 일거 같은데.. TO_NUMBER 해도 결과값이 나오질 않습니다. ㅜㅜ

아무것도 아니라고 생각했는데.. 초보 입장에서는 난갑하네요.. 도와주세요...ㅜㅜ

이 글에 대한 댓글이 총 15건 있습니다.

문자비교와 숫자비교 방식의 차이로 인해
문자로 된 숫자의 경우 올바른 결과가 나오지 않을수는 있습니다.
하지만 문자이든, 숫자이든 상관없이 작성하신 쿼리의 결과가 ' ' 이 나오는 것이 맞는데요?
조건식을 잘못 적용하신 듯 합니다.
어떤 비교식을 원하시는지 설명해 주세요.
데이터에 공백(' ')이 들어가기도 하나요?

마농(manon94)님이 2018-05-28 15:31에 작성한 댓글입니다.

마농님...

 

정말 정말 감사합니다.

 

c1의 값이 a1 보다 커야 하며, c1의 값이 b1 보다 작아야 합니다.

범위 표현된 sql이 잘 못 되었나요?

 

그리고, a1과 b1 이 각각 0 혹은 ' ' 같은 공백이 들어 있는 경우도 있어요

그래서 to_number 으로 형 변환 시 ora-01722 같은 에러도 발생하고요...

아 이거 쉽게 생각했는데.. 난관에 봉착했어요...

 

기준선 문제인데.. 하한과 상한 값 비교 거든요... c1의 값이 하한인 a1보다 커야 하고 상한인 b1 보다는 작아야 ' ' 으로 나와야 하고 그렇지 않으면 out이 나와야 합니다.

 

부등식 조건 뒤는 만약 0 이 거나 ' ' 공백의 경우 다 out이 나오기 때문에 해당 데이터는 제외 하려고 했고요.. ㅜㅜ

 

마농님... 정말 죄송하지만, 다시 한번 더 부탁 드려도 될까요?

감사합니다.

도와주세요님이 2018-05-28 15:52에 작성한 댓글입니다. Edit

0 은 굳이 왜 제외해야 하나요?
0 도 수치 아닌가요?

마농(manon94)님이 2018-05-28 15:59에 작성한 댓글입니다.

마농님..

 

정말 감사 드립니다.

0 은 수치 값이 아니라, 원래 공백으로 처리 해야 하는데,

담당자 마다 이걸 공백으로 처리 하는 경우도 있고 0으로 처리 하는 경우도

있었다고 합니다.

그래서 이 둘을 다 제외 해야 하는 상황입니다. ㅜㅜ

방법이 있을까요? 마농님....

 

바쁘실텐데, 감사합니다.

도와주세요님이 2018-05-28 16:03에 작성한 댓글입니다. Edit

공백이나 0 이 들어 있으면 결과가 어떻게 나와야 하나요?

마농(manon94)님이 2018-05-28 16:07에 작성한 댓글입니다.

마농님..

 

만약 a1 이나 b1 에 0이나 공백이 들어 가 있으면 결과 값은 공백으로 나오면 됩니다.

 

만약 a1이 공백이거나 0이고 b1이 정상적인 숫자인 상태로 부등호 연산이 이루어 지면 b1의 결과에 따라 out 이냐 공백이냐가 결정나게 됩니다.

즉 a1이 공백이거나 0이면 하한선은 없다고 보고 b1 인 상한선만 가지고 결과를 만들어 내게 됩니다. 반대의 경우도 마찬가지고요..

즉 하한선, 상한선이 모두 존재 하는 케이스, 둘중 하나만 존재 하는 케이스 이렇게 되는 겁니다.

 

아 그렇다면.. 만약 a1의 공백이거나, 0이면 to_number(a1,'-99999.99') 이런식으로 처리 하면 문제 없지 않을까요? 맞나요????ㅜㅜ

 

감사합니다. 마농님... ㅜㅜ

도와주세요님이 2018-05-28 16:13에 작성한 댓글입니다. Edit

음수도 존재하나요?

마농(manon94)님이 2018-05-28 16:15에 작성한 댓글입니다.

마농님..

 

음수는 존재 하지 않습니다.

감사합니다.

도와주세요님이 2018-05-28 16:17에 작성한 댓글입니다. Edit

아.. 마농님..

 

음수가 존재 합니다. 음수가 있는 놈도 있네요..ㅜㅜ

죄송요..

도와주세요.님이 2018-05-28 16:19에 작성한 댓글입니다. Edit

WITH t1 AS
(
SELECT '3.4' a1, '7.6' b1 FROM dual
UNION ALL SELECT ' ', '7.6' FROM dual
UNION ALL SELECT '3.4', '0' FROM dual
)
, t2 AS
(
SELECT '3' c1 FROM dual
UNION ALL SELECT '4' c1 FROM dual
)
SELECT a.a1
     , a.b1
     , c.c1
     , a2
     , b2
     , CASE WHEN c.c2 BETWEEN a2 AND b2
            THEN 'IN' ELSE 'OUT' END result
  FROM (SELECT a1, b1
             , NVL(TO_NUMBER(TRIM(a1)), 0) a2
             , NVL(TO_NUMBER(TRIM(DECODE(b1, '0', '', b1))), 99999) b2
          FROM t1
        ) a
     , (SELECT c1
             , TO_NUMBER(c1) c2
          FROM t2
        ) c
;

마농(manon94)님이 2018-05-28 16:21에 작성한 댓글입니다.

0 에 대한 해석이 모호합니다.
이게 입력을 안해서 0 인지? 실제로 0 을 입력한건지 판단이 불가능 합니다.
0 을 인정해야 하는게 아닐런지요?

마농(manon94)님이 2018-05-28 16:23에 작성한 댓글입니다.
이 댓글은 2018-05-28 16:23에 마지막으로 수정되었습니다.

마농님.

 

바쁘실텐데. .. 정말정말 감사 드립니다.

앓던 이가 빠졌습니다. 정말 굿입니다. ^^;

큰 도움 받았습니다.

항상 큰 도움 받아 너무 감사드립니다.

건승하세요..

도와주세요.님이 2018-05-28 16:29에 작성한 댓글입니다. Edit

마농님.

 

0은 공백과 같아서.. 부등식 처리에 넣어서는 않된다고 합니다.

보내 주신 쿼리로도 제가 볼땐 문제가 해결 될 거 같습니다.

다시 한번 진심으로 너무 감사 드립니다. ^^

 

도와주세요.님이 2018-05-28 16:31에 작성한 댓글입니다. Edit

WITH t1 AS
(
SELECT '3.4' a1, '7.6' b1 FROM dual
UNION ALL SELECT '0', '7.6' FROM dual
UNION ALL SELECT ' ', '7.6' FROM dual
UNION ALL SELECT '3.4', '0' FROM dual
UNION ALL SELECT '3.4', ' ' FROM dual
)
, t2 AS
(
SELECT '3' c1 FROM dual
UNION ALL SELECT '4' c1 FROM dual
)
SELECT a.a1
     , a.b1
     , c.c1
     , a2
     , b2
     , CASE WHEN c.c2 BETWEEN a2 AND b2
            THEN 'IN' ELSE 'OUT' END result
  FROM (SELECT a1, b1
             , NVL(TO_NUMBER(DECODE(a1, ' ', '', '0', '', a1)), -99999) a2
             , NVL(TO_NUMBER(DECODE(b1, ' ', '', '0', '', b1)), +99999) b2
          FROM t1
        ) a
     , (SELECT c1
             , TO_NUMBER(c1) c2
          FROM t2
        ) c
;

마농(manon94)님이 2018-05-28 16:39에 작성한 댓글입니다.

마농님..

 

이렇게 까지 많은 도움 주셔서 감사합니다.

몇일 앓던 문제가 해결 될 거 같아요..ㅋㅋㅋㅋ

 

이제 프로그램 수정 후 한번 테스트 해 봐야 할 거 같습니다.

빠른 답변 너무 감사 드립니다. 오늘은 운이 좋았던 거 같아요..

이렇게 빨리 답을 얻게 되어서요...

 

건승하세요.. 화이팅!!!!!

도와주세요.님이 2018-05-28 16:44에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
41578GROUP BY 절의 간단한 문의 [2]
DB초보
2018-06-14
5446
41577안녕하세요...질문이있습니다~~ [1]
윤지환
2018-06-11
4884
41576테이블 스페이스에 데이터파일을 추가하려고 합니다. [1]
선이
2018-05-29
5212
41575sql 문제 ..도와주세요...ㅜㅜ [15]
도와주세요
2018-05-28
5602
41574쿼리 질문좀 드려도 될까요? [6]
yub
2018-05-28
5424
41573update set 컴럼 조건 주기 가능한가요? [1]
안정수
2018-05-26
5378
41571디비링크 가능여부 문의합니다. [2]
김기훈
2018-05-24
5318
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다