Dlaczego 0 jest równe pustemu ciągowi?


23

Potrzebuję pomocy w ustaleniu, dlaczego T-SQLzwraca następującą instrukcję 1(prawda):

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

Wydaje mi się, że ktoś zmienił ANSIopcję SET ANSI_NULLSlub coś, co powoduje takie zachowanie.

Mój problem polega na tym, że łączę niektóre wartości, aw ostatnim zestawie wierszy mam wartości, które są połączone, 0i ''wartości, co jest niepoprawne.

Odpowiedzi:


31

To tylko udokumentowane zachowanie. Nie sądzę, żeby ktokolwiek pomieszał z ustawieniami.

Zobacz pierwszeństwo typu danych w MSDN.

Gdy operator łączy dwa wyrażenia różnych typów danych, reguły pierwszeństwa typu danych określają, że typ danych o niższym priorytecie jest konwertowany na typ danych o wyższym priorytecie.

Jak zauważono w komentarzach, pusty ciąg znaków jest konwertowany na 0 w dowolnym typie numerycznym i na 1900-01-01 00: 00: 00.000 po konwersji na datę.

EDYCJA: Myślę, że twoim prawdziwym problemem jest to, że twój projekt jest taki, że musisz dołączyć do pól innego typu danych. Jedynym sposobem obejścia tego problemu jest konwersja klauzuli łączenia, co wpłynie negatywnie na wydajność zapytań. Głównym problemem jest prawdopodobnie projekt schematu

EDYCJA: W komentarzach, które zostały przeniesione na czat, była wiele dyskusji. Jakkolwiek nielogiczne może się to wydawać, konwersja pustego łańcucha na inne typy danych generuje dowolne wartości.

Ten kod:

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

Daje to wyjście:

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

Można się zatem spodziewać, że to zachowanie jest spójne między innymi poprzednimi typami danych i oczekiwać, że konwersja 0 na datę da tę samą dowolną wartość, ale nie jest.

SELECT CONVERT(date, 0)

Produkuje

Jawna konwersja z typu danych int na datę jest niedozwolona.

Ponieważ nie jest to obsługiwana konwersja

podczas

SELECT CONVERT(datetime, 0)

Zwroty

1 stycznia 1900 00:00:00

Tak, to dziwne i arbitralne, ale faktycznie udokumentowane i możliwe do wyjaśnienia.


Komentarze nie są przeznaczone do rozszerzonej dyskusji; rozmowa na temat tej odpowiedzi została przeniesiona do czatu .
Paul White mówi GoFundMonica

2
Czy zachowanie CAST('' AS INT)-> 0 jest gdzieś udokumentowane? Byłoby miło dodać referencję.
Salman,

2
@SalmanA: Powinien być udokumentowany w sekcji „Konwertowanie danych znaków” dokumentacji char / varchar , ale obecnie tak nie jest. Zostawiłem komentarz zwrotny z prośbą o uwzględnienie.
Heinzi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.