Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / iif и конкатенация / 25 сообщений из 30, страница 1 из 2
28.02.2020, 23:17
    #39932440
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
Вот такая заковыка получается, когда после iif идет конкатенация:

Код: sql
1.
2.
3.
iif( true, '0123456789', 'dummy text with length 24' ) || 'text after concatenation'

result = '0123456789               text after concatenation' -- добивает пробелами до длины самого длинного из параметров iif



Но:

Код: sql
1.
2.
3.
iif( true, '0123456789', 'dummy text with length 24' ) 

result = '0123456789' -- никаких лишних пробелов!



Если уж добивать, то везде одинаково. Но лучше все-таки без хвостов.

Firebird 3.02
Windows Server
...
Рейтинг: 0 / 0
28.02.2020, 23:56
    #39932445
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
shalamyansky,

Без хвостов не получится, ибо это, типа, стандарт. Скорее всего пересмотрят, если подтвердился, чтобы оба были с хвостами.
...
Рейтинг: 0 / 0
29.02.2020, 01:28
    #39932450
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
shalamyanskyresult ='0123456789' -- никаких лишних пробелов!

Значит их кто-то принудительно обрезал, ибо, как уже сказано, это стандарт. Ну или ты
просто их не видишь, поскольку они... хммм... пробелы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.02.2020, 08:20
    #39932464
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
shalamyansky
Вот такая заковыка получается, когда после iif идет конкатенация:

Код: sql
1.
2.
3.
iif( true, '0123456789', 'dummy text with length 24' ) || 'text after concatenation'

result = '0123456789               text after concatenation' -- добивает пробелами до длины самого длинного из параметров iif



Но:

Код: sql
1.
2.
3.
iif( true, '0123456789', 'dummy text with length 24' ) 

result = '0123456789' -- никаких лишних пробелов!



Во втором случае получается
Код: sql
1.
'0123456789               '


Проверить просто
Код: sql
1.
'<' || iif( true, '0123456789', 'dummy text with length 24' ) || '>'
...
Рейтинг: 0 / 0
29.02.2020, 18:09
    #39932556
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
Да, был неправ, прошу простить, хвосты всегда есть:

Код: sql
1.
2.
3.
char_length( iif( true, '0123456789', 'dummy text with length 25' ) )

result = 25



Однако, неприятно неожиданный какой стандарт.
...
Рейтинг: 0 / 0
29.02.2020, 23:49
    #39932597
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
shalamyansky,

А если явно закастить оба аргумента в iif() к varchar-ам?
...
Рейтинг: 0 / 0
01.03.2020, 12:38
    #39932645
Sergey1979
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
А если помеcтить iif() в trim?
...
Рейтинг: 0 / 0
01.03.2020, 20:19
    #39932784
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
Vlad F
А если явно закастить оба аргумента в iif() к varchar-ам?


Если привести аргументы к varchar, нормально получается. Только длинно и некрасиво. Да выкрутиться можно кучей способов, если знать. Только вот знания обретаются уже в бою, это не есть хорошо. Напарываешься, чешешь репу, обходишь.

Пожелание к разработчикам документации: хорошо бы такое не слишком интуитивное поведение все-таки описывать, даже если оно и по стандарту. Понять, где собака зарыта, можно, но предугадать трудно, пока не споткнешься.
...
Рейтинг: 0 / 0
01.03.2020, 20:28
    #39932785
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
shalamyansky,

таки не поверишь оно там описано. Но надо знать где.
Не могу же я в каждую функцию работающую со строками предупреждение вешать
...
Рейтинг: 0 / 0
01.03.2020, 23:06
    #39932814
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
Просто не надо использовать строковые литералы. Вообще. Никогда. И будет вам счастье.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.03.2020, 11:08
    #39932898
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
trim
...
Рейтинг: 0 / 0
02.03.2020, 15:23
    #39933033
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
Симонов Денис

таки не поверишь оно там описано. Но надо знать где.
Не могу же я в каждую функцию работающую со строками предупреждение вешать

"Тип возвращаемого результата: тот же что и аргумент функции resultT, если выражения
resultT и resultF имеют одинаковый тип, в противном случае происходит преобразование в
тип с наибольшей вместимостью."

Да, согласен, этот текст описывает поведение почти достаточно. Прошу прощения за невнимательность. К этому еще бы прибавить знание, что строковые литералы приводятся к типу CHAR, а не VARCHAR, что тоже не вполне очевидно.

Dimitry Sibiryakov

Просто не надо использовать строковые литералы. Вообще. Никогда. И будет вам счастье.

А как без них, например, сложить имя с фамилией через пробел? Пробел как оформить без литерала? Ввести переменную :space и присвоить ей значение (опять же через литерал)? Держать специальную таблицу с кусками строк?
...
Рейтинг: 0 / 0
02.03.2020, 15:36
    #39933043
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
shalamyanskyА как без них, например, сложить имя с фамилией через пробел?

Никак не надо их складывать. Но если решил нарушать первую НФ - готовься к геморрою, всё
закономерно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.03.2020, 16:12
    #39933077
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
shalamyanskyК этому еще бы прибавить знание, что строковые литералы приводятся к типу CHAR

строковые литералы ни к чему не приводятся, они просто типа CHAR(N), если конечно не делать приведение специально
...
Рейтинг: 0 / 0
02.03.2020, 16:20
    #39933085
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
Причем тут НФ? Вопрос вообще никакого отношения к отношениям не имеет, и это не тавтология. Вопрос не о размещении данных в реляционных таблицах, а о логике их обработки, в частности, о логике представления. Что такой запрос нарушает?

select
firstname || ' ' || surname
from
persons

Да, можно склеить и на клиенте. Так рассуждать, так и вообще никакие операции на сервере не нужны, только "возьми сырые данные" - "отдай сырые данные".
...
Рейтинг: 0 / 0
02.03.2020, 16:26
    #39933090
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
Симонов Денис

строковые литералы ни к чему не приводятся, они просто типа CHAR(N), если конечно не делать приведение специально

[/quot]
Хорошо, надо иметь знание, что строковые литералы именно типа CHAR(N), а не VARCHAR(N). Из чего это следует? С числовыми константами, кстати, тоже не очевидно. Какого типа константа 1? А константа 1.0?
...
Рейтинг: 0 / 0
02.03.2020, 16:31
    #39933094
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
shalamyanskyВопрос не о размещении данных в реляционных таблицах, а о логике их обработки, в
частности, о логике представления. Что такой запрос нарушает?

Результат запроса можно (а зачастую и нужно) рассматривать как реляционную таблицу. И
запрос, который запихнул два атрибута в одно поле, нарушает именно её, первую НФ.

shalamyanskyТак рассуждать, так и вообще никакие операции на сервере не нужны, только "возьми сырые
данные" - "отдай сырые данные".
Да. Именно это я и талдычу всю свою сознательную жизнь. Но всё равно находятся
топикстартеры, которые героически ищут и успешно находят геморрой себе на всю голову.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.03.2020, 16:32
    #39933096
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
shalamyanskyКакого типа константа 1? А константа 1.0?

NUMERIC(1,0) и NUMERIC(2,1) соответственно.
...
Рейтинг: 0 / 0
02.03.2020, 16:37
    #39933101
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
Dimitry Sibiryakov

Да. Именно это я и талдычу всю свою сознательную жизнь. Но всё равно находятся
топикстартеры, которые героически ищут и успешно находят геморрой себе на всю голову.

Да бог с ними, с топикстартерами. Но вот люди стараются, развивают PSQL, пишут функции IIF и иже с ними. Для кого, спрашивается?
...
Рейтинг: 0 / 0
02.03.2020, 16:42
    #39933106
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
shalamyanskyДля кого, спрашивается?

Дык для топикстартеров же. Они же не просто самостоятельно ищут приключений, они активно
требуют от других предоставить им больше возможностей выстрелить себе во всё, что только
можно представить.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.03.2020, 16:46
    #39933110
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
Dimitry Sibiryakov

Какого типа константа 1? А константа 1.0?
NUMERIC(1,0) и NUMERIC(2,1) соответственно.

Верю, куда деться. А как это узнать, не задавая вопрос гуру на форуме? Где-нибудь может оказаться важным, как оказалось важным знание, что строковые литералы - это CHAR.
...
Рейтинг: 0 / 0
02.03.2020, 16:54
    #39933118
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
shalamyansky Какого типа константа 1? А константа 1.0?

от диалекта зависит
...
Рейтинг: 0 / 0
02.03.2020, 16:57
    #39933125
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
shalamyansky
Dimitry Sibiryakov

Какого типа константа 1? А константа 1.0?
NUMERIC(1,0) и NUMERIC(2,1) соответственно.

Верю, куда деться. А как это узнать, не задавая вопрос гуру на форуме? Где-нибудь может оказаться важным, как оказалось важным знание, что строковые литералы - это CHAR.


чаще всего в стандартах. там очень много букв.

ЗЫ кроме меня кто-нибудь помнит, что в фортране переменные I, J, K, L, M - целочисленные, остальные - вещественные.
а если написать строчечку в начале - то комплЕксные.
...
Рейтинг: 0 / 0
02.03.2020, 17:03
    #39933127
shalamyansky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
Dimitry Sibiryakov

Дык для топикстартеров же. Они же не просто самостоятельно ищут приключений, они активно
требуют от других предоставить им больше возможностей выстрелить себе во всё, что только
можно представить.

Я понял, вы апологет чистого реляционного стиля. Позиция, достойная разработчика сервера СУБД. Проблему с глаз долой, из сердца вон. Но если задачу не решать на уровне СУБД, её все равно придется решать так или иначе, и не факт, что уровнем выше её решение будет проще, или эффективнее, или надежнее. Но с точки зрение сервера, конечно, ни к чему брать на себя лишнее.
...
Рейтинг: 0 / 0
02.03.2020, 17:27
    #39933139
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iif и конкатенация
shalamyansky,

shalamyanskyПозиция, достойная разработчика сервера СУБД.

забей. Дима вообще не занимается прикладным программированием, поэтому и ворчит. Если бы разработчики FB его слушали, то в сервере до сих пор бы встроенных функций не было, которые массово появились в 2.1.

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


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