powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / iif и конкатенация
30 сообщений из 30, показаны все 2 страниц
iif и конкатенация
    #39932440
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' -- никаких лишних пробелов!



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

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

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

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

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

result = 25



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

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


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

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

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

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

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

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

Dimitry Sibiryakov

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

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

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

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

select
firstname || ' ' || surname
from
persons

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

Спасибо! Ну, надо знать, значит, буду знать. Уже знаю.
...
Рейтинг: 0 / 0
iif и конкатенация
    #39933155
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shalamyanskyА как это узнать, не задавая вопрос гуру на форуме?

Например, включить мозг и задействовать элементарную формальную логику.

Литерал состоит из букв? Да. Значит это CHAR. Он может менять свою длину? Нет. Значит это
не VARYING CHAR.

Литерал состоит из цифр? Да. Значит это NUMRIC. Количество цифр в нём две? Да. Значит это
NUMERIC(2, ?). После десятичной точки сколько цифр? Одна. Значит это NUMERIC(2,1).

Бинго!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
iif и конкатенация
    #39933161
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor

ЗЫ кроме меня кто-нибудь помнит, что в фортране переменные I, J, K, L, M - целочисленные, остальные - вещественные.

блин это не забывается никак, а то что посвежее выветривается моментально
Но кажется все-же не "переменные I, J, K, L, M" а переменные имя которых начинающиется с I, J, K, L, M, N
pastor
а если написать строчечку в начале - то комплЕксные.

а вот про строчечку что-то не помню
...
Рейтинг: 0 / 0
iif и конкатенация
    #39933267
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor
ЗЫ кроме меня кто-нибудь помнит, что в фортране переменные I, J, K, L, M - целочисленные

Помнит. До сих пор так называю :)
...
Рейтинг: 0 / 0
iif и конкатенация
    #39933340
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor
ЗЫ кроме меня кто-нибудь помнит, что в фортране переменные I, J, K, L, M - целочисленные, остальные - вещественные.
а если написать строчечку в начале - то комплЕксные.

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


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