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차 선택 기능
- 첫 번째 데이터 유형 선택
- 두 번째 선택 기능
- 조합
- 두 번째 데이터 유형 선택
저는 이것을 단계적으로 증명하려고 노력할 것이지만, 그것이 절대적인 증거가 될 것인지 확신할 수 없습니다.
다음 쿼리 모두
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
'programing' 카테고리의 다른 글
Spring Boot 웹 소켓(StoppSession)이 있는 Django 채널이 작동하지 않음 (0) | 2023.08.02 |
---|---|
문자열을 이진으로 변환한 다음 PHP를 사용하여 다시 변환 (0) | 2023.08.02 |
Python 시간 측정 함수 (0) | 2023.08.02 |
PHP에서 SQL Server에 연결하는 동안 "Adaptive Server를 사용할 수 없거나 존재하지 않습니다" 오류가 발생했습니다. (0) | 2023.08.02 |
파이썬에서 여러 변수를 저장하고 복원하려면 어떻게 해야 합니까? (0) | 2023.08.02 |