2011-02-09 2 views
4

Может кто-нибудь, пожалуйста, объясните мне, что происходит с этим вопросом?Необычный T-SQL - Что здесь происходит?

select 99.foo 

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

select 99 as foo 

или

select foo = 99 

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

+0

Interesting; и SELECT $ .foo вернется 0.00 – mg1075

+0

Кроме того, SELECT 99foo дает тот же результат, что и 99.foo, но SELECT $ foo дает ошибку. – mg1075

+0

Не знаете, почему вы говорите, что он работает только с целыми числами? 'select 99.123foo' возвращает столбец с именем' foo' со значением '99.123' для меня –

ответ

7

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

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

Конечный период интерпретируется как «точка нуля», поэтому select 99. foo также работает.

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

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

select 99foo 

select 'ninetynine'foo 
0

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

0

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

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

SELECT 99foo 

и

SELECT 99AS foo 

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

Смежные вопросы