programing

sql의 union 절

stoneblock 2023. 8. 2. 08:40

sql의 union 절

다음 표 설명이 주어집니다.

emp : 

ename varchar2(25)


dept:

loc varchar2(25)

저는 다음과 같은 3가지 경우가 있습니다.

select ename,to_number(null) from emp
union
select to_char(null),loc from dept;

  select ename,to_number(null) from emp
    union
    select to_number(null),loc from dept;

  select ename,null from emp
    union
    select null,loc from dept;

케이스 1은 완벽하게 실행됩니다.

사례 2가 실행에 실패했습니다.

케이스 3 역시 완벽하게 실행됩니다.

제가 이해하기로는 조합에 해당하는 열이 없다면 동등한 데이터 유형의 더미를 만들어야 한다는 것입니다.그러므로, a.number비슷한 것을 갖고 싶어하는 타입to_number(null)다른 테이블의 해당 열 목록에 있습니다.

사례 3에서는 모든 null을 지정하므로 시나리오를 어느 정도 이해할 수 있습니다.그러나 사례 1의 경우, 데이터 유형 호환성이 없습니다.loc그리고.to_number하지만 실행됩니다.반면에, 사례 2는 실패합니다.명확히 해주세요.

이 대답은 약간 횡설수설할지도 모릅니다...

Oracle은 설정 작업에 매우 까다롭습니다.모든 열은 두 번째, 세 번째 등의 쿼리에 있는 해당 열과 동일한 데이터 유형을 가져야 합니다.

오라클이 평가하기 때문에 두 번째 쿼리가 실패한 것 같습니다.to_number()수행하기 전의 숫자로union하지만 그 후에 "순수함"을 평가합니다.첫 번째 값이 "null-ness"에 대해 평가된 후 다음 값이 다음과 같이 평가되었기 때문에 첫 번째 쿼리가 성공합니다.union일어나다.이는 평가 순서가 다음과 같다는 것을 의미합니다.

  1. 1차 선택 기능
  2. 첫 번째 데이터 유형 선택
  3. 두 번째 선택 기능
  4. 조합
  5. 두 번째 데이터 유형 선택

저는 이것을 단계적으로 증명하려고 노력할 것이지만, 그것이 절대적인 증거가 될 것인지 확신할 수 없습니다.

다음 쿼리 모두

select 1 from dual union select '1' from dual;
select '1' from dual union select 1 from dual;

은(는) 암시적 변환이 수행되지 않기 때문에 다음 오류와 함께 실패합니다.

ORA-01790: 식의 데이터 형식이 해당 식과 같아야 합니다.

그러나 다음 두 가지 모두 성공할 것입니다.

select null from dual union select '1' from dual;
select null from dual union select 1 from dual;

이 두 쿼리 중 하나를 선택하면 다음이 반환됩니다.

SQL> select dump(a)
  2    from ( select null a from dual union select '1' from dual );

DUMP(A)
-------------------------------------------------------------------

Typ=96 Len=1: 49
NULL

SQL> select dump(a)
  2    from ( select null a from dual union select 1 from dual );

DUMP(A)
-------------------------------------------------------------------

Typ=2 Len=2: 193,2
NULL

보시다시피 열에는 서로 다른 데이터 유형이 있습니다.문자가 있는 첫 번째 쿼리는 다음을 반환합니다.char그리고 두 번째는 숫자를 반환하지만, 두 번째는 순서가 뒤바뀌었습니다.select일등의

마지막으로 저희가.dump당신의 첫번째 질문의

SQL> select substr(dump(ename),1,35) a, substr(dump(loc),1,35) b
  2    from ( select ename,to_number(null) as loc from emp
  3            union
  4           select to_char(null),loc from dept
  5                  );

A                                   B
----------------------------------- -----------------------------------
Typ=1 Len=6: 104,97,104,97,104,97   NULL
NULL                                Typ=1 Len=6: 104,97,104,97,104,97

SQL>

보다시피dump(to_number(null))null이지만 avarchar2조금도 아닌char이는 열의 데이터 형식이므로 반환됩니다.반환된 문의 순서가 뒤바뀌지 않았으며 이 쿼리를 테이블로 만들 경우 두 열이 모두varchar2.

선택 쿼리에서 열의 데이터 유형을 결정할 때 Oracle은 가장 먼저 알려진 데이터 유형을 사용하여 전체 데이터 유형을 계산합니다.이것이 첫 번째가 어디에 있는지 쿼리하는 이유입니다.select행이 반전된 경우 null입니다.

첫 번째 선택으로 인해 첫 번째 쿼리가 성공합니다.select ename,to_number(null) from emp결과 집합이 어떻게 보일지 "결정"합니다.|varchar2|null|그런 다음 두 번째 쿼리는 다음과 같이 추가합니다.|varchar2|varchar2|아무 문제도 일으키지 않습니다.

선택 첫 번 선 택 인 번 쿼 리 가 실 합 니 패 다 째 두 째 해 으 로 ▁fails ▁the ▁because ▁query ▁your 니 다 합 ▁second 실 패 첫 ▁select 가 ▁firstselect ename,to_number(null) from emp를 ""로 설정한 "varchar2, null를 null에 union.

여기서 믿음의 비약은 오라클이 결정하는 것입니다.to_number(null)앞의 숫자입니다.union그리고 그 후까지 그것을 "순수함"으로 평가하지 않았습니다.개체를 만들 수 없기 때문에 실제로 이러한 현상이 발생하는지 테스트하는 방법을 잘 모르겠습니다.null열을 선택할 수도 없습니다.

Oracle에서 허용하지 않는 것을 증명할 수 없기 때문에 경험적 증거를 찾아보겠습니다.다음 쿼리의 결과(또는 오류)를 고려합니다.

SQL> select 1 as a from dual union select to_number(null) from dual;

         A
----------
         1


SQL> select '1' as a from dual union select to_number(null) from dual;
select '1' as a from dual union select to_number(null) from dual
       *
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression


SQL> select 1 as a from dual union select to_char(null) from dual;
select 1 as a from dual union select to_char(null) from dual
       *
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression


SQL> select '1' as a from dual union select to_char(null) from dual;

A
-
1

그들은 그것을 증명하는 것처럼 보입니다.to_char그리고.to_number 데이터 하는 데이터 유형을 null에 합니다.union에 앞서 "ness "의수에함" 한평가 앞서에 대그앞서▁prior에에.

이 설명은 또한 다음을 다룰 것입니다.coalesce로서발는되행으로 합니다.to_number(null)null이 되기 의 숫자입니다.

언급URL : https://stackoverflow.com/questions/12057748/union-clause-in-sql