Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 что не так с IIF  [new]
WertAndrey
Member

Откуда: Калининград
Сообщений: 78
доброго дня уважаемые.
давно не писал на sql, но вот понадобилось...

SELECT IIF ( n_draug > k_draug, n_draug, k_draug ) AS Result FROM moving m
дает ошибку Неправильный синтаксис около конструкции ">"

поискал в документации, вот пример оттуда:
DECLARE @a int = 45, @b int = 40
SELECT IIF ( @a > @b, 'TRUE', 'FALSE' ) AS Result
дат ту же ошибку - Неправильный синтаксис около конструкции ">"

где я туплю? (case не предлагать)

select @@version - Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
5 сен 14, 11:49    [16539017]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
pegoopik
Member

Откуда: Новосибирск
Сообщений: 54
WertAndrey
select @@version - Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)


IIF появился в 2012
И вообще плохой тон использовать IIF вместо CASE
5 сен 14, 11:51    [16539038]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
WertAndrey
Member

Откуда: Калининград
Сообщений: 78
спасибо..... что-то с версиями тупанул.......
5 сен 14, 11:53    [16539066]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
WertAndrey
Member

Откуда: Калининград
Сообщений: 78
хотя - чем case лучше IIF ??
5 сен 14, 11:57    [16539113]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
pegoopik
WertAndrey
select @@version - Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)


IIF появился в 2012
И вообще плохой тон использовать IIF вместо CASE


И в чем же заключается плохой тон?
5 сен 14, 12:03    [16539173]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
Glory
Member

Откуда:
Сообщений: 104760
CASE - это ANSI SQL
IIF - это расширение TSQL
5 сен 14, 12:07    [16539228]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
Exproment
Member

Откуда:
Сообщений: 416
pegoopik
И вообще плохой тон использовать IIF вместо CASE

isnull тоже плохой тон ? наше все ?
5 сен 14, 12:10    [16539270]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
Exproment
Member

Откуда:
Сообщений: 416
Exproment, * coalesce наше все
5 сен 14, 12:11    [16539273]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
GETDATE() -> CURRENT_TIMESTAMP,
CONVERT() -> CAST() (иногда, правда, и не заменишь)
TIMESTAMP -> ROWVERSION
5 сен 14, 12:28    [16539452]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Если что-то имеет обратную совместимость - это не может быть плохо или хорошо. То же самое, только вид сбоку. Все равно, что вместо нерекурсивного CTE использовать подзапрос.

Если же говорить о дурном тоне, то язык MySQL вообще один сплошной дурной тон :) Как-то живут с этим :)
5 сен 14, 12:52    [16539652]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
o-o
Guest
Владислав Колосов
Если что-то имеет обратную совместимость

не обратную, а "кросс-платформенную"
переносимость на какой-нибудь Oracle или DB2.

мне вот подсунули как-то с аксесса запросы переписывать,
приятного мало было лезть искать этот IIF
5 сен 14, 13:01    [16539755]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
pegoopik
Member

Откуда: Новосибирск
Сообщений: 54
WertAndrey
хотя - чем case лучше IIF ??


Тем что у вас CASE - работает, а IIF - нет :)
И не только у вас:)

Да и вложенный CASE выглядит понятнее, чем вложенный IIF

Вот например такое нечто

CASE F1
  WHEN V1 THEN S1
  WHEN V2 THEN S2
  WHEN V3 THEN 
    CASE 
      WHEN F2=A2 THEN S3 ELSE S4 END
    END
  ELSE S5
END


а теперь как это будет выглядеть с IIF

IIF(F1=V1, S1, 
  IIF(F1=V2, S2, 
    IIF(F1=V3, 
      IIF(F1=A2, S3, S4)
      ,S5
    )
  )
)


Дело вкуса конечно. Но скажем кусок какого-то алгоритма, написанного на 2012 сервере с кучей IIF'ов надо перенести на 2008r2
Не вижу объективных плюсов использовать IIF (ИМХО)
5 сен 14, 13:15    [16539884]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
pegoopik
Member

Откуда: Новосибирск
Сообщений: 54
Exproment
isnull тоже плохой тон ? coalesce наше все ?


Пользую и то и то, от обстоятельств.
Сравните лучше такие запросы и объясните явление:)

SELECT COALESCE(NULL, NULL)

SELECT ISNULL(NULL, NULL)
5 сен 14, 13:31    [16540021]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
o-o
Guest
pegoopik
Тем что у вас CASE - работает, а IIF - нет :)
И не только у вас:)
...Не вижу объективных плюсов использовать IIF (ИМХО)


привести еще раз обратную ситуацию?
дали мне кучу аксессных запросов, в 2008R2 они не работают, а в 2012 -- да

не надо катить на IIF, надо искать причину, занафига его ввели.
причина -- та самая:
The nonstandard IIF and CHOOSE functions were added in SQL Server 2012 to support easier
migrations from Microsoft Access


нет у вас надобности его использовать -- зацените, как вам повезло
5 сен 14, 13:35    [16540039]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
pegoopik
SELECT COALESCE(NULL, NULL)

SELECT ISNULL(NULL, NULL)


SELECT COALESCE(NULL, (SELECT NULLIF(1, 1)))

Ошибок нет, ANSI SQL соблюден.

:-)
5 сен 14, 13:37    [16540057]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
pegoopik
Exproment
isnull тоже плохой тон ? coalesce наше все ?


Пользую и то и то, от обстоятельств.
Сравните лучше такие запросы и объясните явление:)

SELECT COALESCE(NULL, NULL)


SELECT ISNULL(NULL, NULL)
В первом случае COALESCE должен привести все аргументы перед вычислением к типу с наибольшим приоритетом,
во втором случае тип второго аргумента приводится к типу первого.

Видимо, Microsoft в данном случае относится к нетипизированному NULL проще, чам ANSI в своём стандарте.
К какому типу приводить ведь действительно неясно.
5 сен 14, 13:38    [16540064]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
pegoopik
Member

Откуда: Новосибирск
Сообщений: 54
o-o
нет у вас надобности его использовать -- зацените, как вам повезло


Не жалуюсь:))

o-o
The nonstandard IIF and CHOOSE functions were added in SQL Server 2012 to support easier
migrations from Microsoft Access


Не знал, но логично.
А CHOOSE использую, симпатичная ф-я.
5 сен 14, 13:40    [16540079]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
pegoopik,

В случае COALESCE(NULL, NULL) Вы получите сообщение об ощибке:
Сообщение 4127, уровень 16, состояние 1, строка 1
Хотя бы один из аргументов COALESCE должен быть выражением, отличным от константы NULL.


В случае ISNULL(NULL, NULL) получите NULL.

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

Различие этих функций хорошо описано в справке.

По поводу IIF - этот оператор был введен для облегчения перехода с MS Access на MS SQL Server. Поэтому лучше CASE.
5 сен 14, 13:45    [16540139]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
o-o
Guest
Wlr-l
pegoopik,
Различие этих функций хорошо описано в справке.

прикольно, когда кто-то про кого-то знает
pegoopik на этом различии собаку съел даво, он спецом провоцирует :)
Жень, а че ты здесь редко бываешь? тут тоже подходящая компания
5 сен 14, 13:51    [16540197]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
Wlr-l
Member

Откуда:
Сообщений: 522
Но в случае:

declare @a int = null, @b int = null;
SELECT COALESCE(@a, @b);


вернет null.
5 сен 14, 13:55    [16540231]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
o-o
Владислав Колосов
Если что-то имеет обратную совместимость

не обратную, а "кросс-платформенную"
переносимость на какой-нибудь Oracle или DB2.

мне вот подсунули как-то с аксесса запросы переписывать,
приятного мало было лезть искать этот IIF


Согласен, приятного мало, но это выполнимо, что самое главное. Хуже если языковые конструкции не переносятся "легким движением руки", например format().
Например, новомодные +=, *= и т.д. тоже можно считать плохим примером синтаксиса.
5 сен 14, 14:01    [16540282]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
o-o
Guest
Владислав Колосов,

не, я про то, что когда пишут
Glory
CASE - это ANSI SQL
IIF - это расширение TSQL

то имеется в виду безболезненный перенос на другую СУБД, а не обратная совместимость.
т.е. это было уточнение к вашей фразе
Владислав Колосов
Если что-то имеет обратную совместимость - это не может быть плохо или хорошо


переносить ANSI-совместимый код проще, в этом смысле еще как "хорошо".
другое дело, что часто "заточенное под конкретную СУБД" будет работать быстрее,
и на эту тему можно развести холиварище "универсальные решения работают всюду универсально плохо",
так что тут и хорошо, и плохо, но лучше не начинать
5 сен 14, 14:21    [16540421]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Могу предложить желающим интересный трюк с IIF . Создайте а таблице вычисляемое поле с IIF -- любое выражение с IIF, а потом снимите скрипт этой таблицы. Там окажется CASE.
5 сен 14, 14:29    [16540459]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
o-o
Guest
a_voronin,

прикольно, да.
и если CHECK CONSTRAINT навесить с IIF, то тоже через CASE его записывает.
выходит, они просто "переводчик" для IIF написали,
в системные таблицы попадает уже "переведенное" через CASE, от IIF и следа не осталось
5 сен 14, 14:50    [16540601]     Ответить | Цитировать Сообщить модератору
 Re: что не так с IIF  [new]
случайно заглянул
Guest
o-o
a_voronin,

прикольно, да.
и если CHECK CONSTRAINT навесить с IIF, то тоже через CASE его записывает.
выходит, они просто "переводчик" для IIF написали,
в системные таблицы попадает уже "переведенное" через CASE, от IIF и следа не осталось


то же самое с getdate() и current_timestamp
8 сен 14, 07:30    [16547764]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить