Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Возвращаемый результат функции IIF / 11 сообщений из 11, страница 1 из 1
07.09.2018, 15:28
    #39699711
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращаемый результат функции IIF
FB3. Для примера из руководства:
Код: sql
1.
SELECT IIF(SEX = 'M', 'Sir', 'Madam') FROM CUSTOMERS


функция возвратит 'Sir ' (с двумя пробелами сзади). Претензий в общем-то нет. Но если это баг, то надо бы исправить. А если фича, может в руководстве описать случай. Тем более, что case работает по-другому. Мне пришлось поменять iif на case. А iif компактнее (в моём случае), поэтому предпочтительнее.
...
Рейтинг: 0 / 0
07.09.2018, 15:44
    #39699726
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращаемый результат функции IIF
KreatorXXIА если фича, может в руководстве описать случай.

Он описан. Или "CHAR" и "литералы". CASE технически не может работать иначе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
07.09.2018, 15:59
    #39699742
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращаемый результат функции IIF
KreatorXXI,

все строковые литералы являются типом CHAR(N). Любые выражения с CASE, IIF, COALESCE, NULLIF и т.д. всегда возвращают значение с типом наибольшей вместимости. Это описано, но выше в главе про выражения и типы данных. Делать примечания для каждой функции не имеет смысла.
...
Рейтинг: 0 / 0
07.09.2018, 16:05
    #39699749
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращаемый результат функции IIF
Симонов ДенисKreatorXXI,

все строковые литералы являются типом CHAR(N). Любые выражения с CASE, IIF, COALESCE, NULLIF и т.д. всегда возвращают значение с типом наибольшей вместимости. Это описано, но выше в главе про выражения и типы данных. Делать примечания для каждой функции не имеет смысла. Согласен. но зачем-то в руководстве его сделали:
Код: plaintext
1.
IIF(<condition>, resultT, resultF) 
Тип возвращаемого результата: тот же что и аргумент функции resultT.
...
Рейтинг: 0 / 0
07.09.2018, 16:20
    #39699763
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращаемый результат функции IIF
Naf,

согласен, там не точно написано. Это поправим
...
Рейтинг: 0 / 0
07.09.2018, 16:23
    #39699765
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращаемый результат функции IIF
Симонов ДенисKreatorXXI,

все строковые литералы являются типом CHAR(N). Любые выражения с CASE, IIF, COALESCE, NULLIF и т.д. всегда возвращают значение с типом наибольшей вместимости. Это описано, но выше в главе про выражения и типы данных. Делать примечания для каждой функции не имеет смысла.

Case работает по другому. Пробелы не добавляет. Другие не проверял.
...
Рейтинг: 0 / 0
07.09.2018, 16:40
    #39699774
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращаемый результат функции IIF
Naf,

правильно так. Если типы разные, то происходит преобразование к типу с наибольшей вместимостью.

KreatorXXI,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
  iif(true, 1, '') || '3' as n1,
  iif(true, '1', '2') || '3' as n2,
  iif(true, '1', '22') || '3' as n3,
  case
    when true then '1'
    when false then '22'
  end || '3' as n4
from rdb$database



Код: plaintext
1.
2.
N1	N2	N3	N4
13	13	1 3	1 3
...
Рейтинг: 0 / 0
10.09.2018, 16:16
    #39700499
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращаемый результат функции IIF
Симонов Денис,

а можете объяснить результат вот такого запроса:
Код: sql
1.
2.
3.
4.
5.
6.
select
  case 1
    when 1 then '1'
    else '22'
  end || '3' as n4
from rdb$database


?
...
Рейтинг: 0 / 0
10.09.2018, 17:13
    #39700539
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращаемый результат функции IIF
KreatorXXI,

похоже поисковая версия case работает по другому, но ты говорил вообще за весь CASE, а он как минимум имеет 2 синтаксиса
...
Рейтинг: 0 / 0
10.09.2018, 17:38
    #39700560
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращаемый результат функции IIF
Симонов Денис,

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

И вот, если всё так неоднозначно, как по-простому решить задачу. Впереди фамилии в зависимости от условий нужно поставить либо одну звёздочку либо два пробела. Все фамилии собираются list'ом с переводом строки для красивого форматирования.
...
Рейтинг: 0 / 0
10.09.2018, 17:55
    #39700577
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращаемый результат функции IIF
KreatorXXIСимонов Денис,

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

И вот, если всё так неоднозначно, как по-простому решить задачу. Впереди фамилии в зависимости от условий нужно поставить либо одну звёздочку либо два пробела. Все фамилии собираются list'ом с переводом строки для красивого форматирования.

Replace пойдёт, если что.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Возвращаемый результат функции IIF / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]