0이 빈 문자열과 같은 이유는 무엇입니까?


23

다음 T-SQL명령문이 왜 1(true)를 반환 하는지 찾는 데 도움이 필요 합니다.

SELECT IIF( 0 = '', 1, 0)

누군가가 행동을 유발하는 ANSI것과 같은 옵션 SET ANSI_NULLS이나 다른 것을 변경했다고 생각 합니다.

내 문제는 일부 값을 조인하고 마지막 행 집합에 조인 된 값 0''값이 잘못되었습니다.

답변:


31

그것은 단지 문서화 된 행동입니다. 아무도 설정을 엉망으로 생각하지 않습니다.

MSDN의 데이터 형식 우선 순위 를 참조하십시오 .

연산자가 다른 데이터 유형의 두 표현식을 결합 할 때 데이터 유형 우선 순위 규칙은 우선 순위가 낮은 데이터 유형이 우선 순위가 높은 데이터 유형으로 변환되도록 지정합니다.

주석에서 언급했듯이 빈 문자열은 숫자 유형에서 0으로, 날짜로 변환되면 1900-01-01 00 : 00 : 00.000으로 변환됩니다.

편집 : 당신의 진짜 문제는 당신의 디자인이 다른 데이터 유형의 필드에 참여해야한다는 것입니다. 이 문제를 해결하는 유일한 방법은 조인 절을 변환하여 쿼리 성능을 저하시키는 것입니다. 주요 문제는 아마도 스키마 디자인에 있습니다.

편집 : 채팅으로 이동 코멘트에 많은 토론이있었습니다. 그러나 빈 문자열을 다른 데이터 형식으로 변환하면 임의의 값이 생성됩니다.

이 코드는 :

SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')

이 출력을 생성합니다.

0
0
1900-01-01
1900-01-01 00:00:00.000

그러면이 동작이 다른 선행 데이터 유형간에 일관성이있을 것으로 예상 할 수 있으며 0을 날짜로 변환하면 동일한 임의의 값이 생성되지만 그렇지 않습니다.

SELECT CONVERT(date, 0)

생산

데이터 유형 int에서 날짜로의 명시 적 변환은 허용되지 않습니다.

지원되는 전환이 아니기 때문에

동안

SELECT CONVERT(datetime, 0)

보고

1900 년 1 월 1 일 00:00:00

예, 이상하고 임의적이지만 실제로 문서화되고 설명 가능합니다.


의견은 긴 토론을위한 것이 아닙니다. 이 답변에 대한 대화 가 채팅 으로 이동 되었습니다 .
폴 화이트 GoFundMonica 말한다

2
동작 CAST('' AS INT)-> 0이 어딘가에 문서화되어 있습니까? 참조를 추가하면 좋을 것입니다.
Salman A

2
@SalmanA : 그것은 해야한다 의은 "변환 문자 데이터"절에 설명 할 문자 / VARCHAR 문서 ,하지만 현재 없습니다. 의견을 남길 것을 요청했습니다.
Heinzi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.