select 문 알려주실수 있을까요 0 2 2,559

by 어머 select dml [2016.04.03 21:41:10]


SELECT empno, ename, decode(round(dbms_random.value(0,1)), 0, 'man', 'women') gender FROM emp WHERE gender='men';

테스트용으로 random 을 돌려서 남자와 여자를 만들고 남자인것들만 선택할려 합니다.

이 쿼리를 정상적으로 수행시킬수 있는 방법을 알려주세요 ㅜㅜ

by 마농 [2016.04.04 08:24:23]

Where 절이 Select 절보다 먼저이기 때문에
Select 절의 Alias 를 Where 절에서 사용할 수는 없습니다.


표현식 자체를 조건절에서 직접 사용하거나

SELECT empno
     , ename
     , decode(round(dbms_random.value(0,1)), 0, 'man', 'woman') gender
  FROM emp
 WHERE decode(round(dbms_random.value(0,1)), 0, 'man', 'woman') = 'man'
;

인라인뷰를 사용하면 밖에서 알리아스를 사용할 수 있습니다.
 

SELECT *
  FROM (SELECT empno
             , ename
             , decode(round(dbms_random.value(0,1)), 0, 'man', 'woman') gender
          FROM emp
        )
 WHERE gender = 'man'
;

 


by 마농 [2016.04.04 14:38:05]

음.. 일반적인 함수 생각해서 테스트 없이 답변 드렸는데...
테스트 해보니 렌덤 함수는 좀 다른 결과를 내놓는 군요.
첫번째 제시한 방법을 쓰면 안되네요.
렌덤함수를 Where 절에 사용했더니
결과가 모 아니면 도 형태로 나타나네요.(테스트 환경 11g)
결과는 항상 0건 아니면 14건 이 나오며
14건이 나오는 경우 Select 결과는 man 과 woman 이 섞여 나오네요.
이는, 렌덤 함수가 Where 절에서는 단 한번만 수행됨을 의미하며
Where 절과는 별개로 Select 절에서 행수만큼 다시 수행됨을 의미하네요.
원하는 결과를 얻으려면 두번째 방법을 사용하세요.

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