Необычный T-SQL - что здесь происходит? - PullRequest
4 голосов
/ 10 февраля 2011

Может кто-нибудь объяснить мне, что происходит с этим запросом?

select 99.foo

Он ведет себя так же, как

select 99 as foo

или

select foo = 99 

Кроме того, он работает только с целыми числами.

Ответы [ 4 ]

7 голосов
/ 10 февраля 2011

select 99.foo переводится как select 99. as foo (так как вы можете оставить пробел перед псевдонимом), выбрав «99». как numeric. Поскольку после десятичной точки нет чисел, просто отображается «99».

Вы можете подтвердить это, запустив:

select sql_variant_property(99., 'BaseType')

, который возвращает numeric.

Это не то же самое, что select 99 as foo, который выбирает '99', но как int. Это может быть подтверждено прогоном:

select sql_variant_property(99, 'BaseType')

, который возвращает int.

Хотя все три запроса выглядят одинаково, первый отличается от следующих двух в типе возвращаемого значения.

1 голос
/ 10 февраля 2011

'AS' является необязательным, поэтому select 99 foo работает.

Период окончания интерпретируется как "нулевая точка", поэтому select 99. foo также работает.

И нет 'Между значением и псевдонимом должен быть пробел, поэтому select .99foo тоже работает.

Они также работают:

 select 99foo

 select 'ninetynine'foo
0 голосов
/ 10 февраля 2011

По-видимому, запутанная часть, по-видимому,.после 99, который выглядит так, как будто вы запрашиваете у поля принадлежность к объекту с именем 99.

Просто чтобы быть странным, вы можете сделать

SELECT 99foo

и

SELECT 99AS foo

, которые оба работают (и дают int в столбце с именем foo).Примеры использования.кажется, возвращают различные цифры.Я бы сказал, что парсер пытается быть умным.Если вы подразумеваете, что данные относятся к одному из нечисловых типов полей, вы бы заключали данные в апострофы, поэтому вы имели в виду нечто числовое.Поэтому все, что не является числом, используется для вывода псевдонима.

0 голосов
/ 10 февраля 2011

Вы можете написать SELECT col AS name, чтобы получить столбец col с именем name. Разрешено пропускать AS, что означает, что SELECT col name - это то же самое, но также разрешено исключать пространство между ними. В вашем примере 99. - это число 99, а foo - это имя столбца. В примере $.foo, $. - это литерал для значения MONEY, равного 0, поэтому он выводит 0.00.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...