powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Лишний пробел
22 сообщений из 22, страница 1 из 1
Лишний пробел
    #39895352
SHS_SHS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.
Заметил такую особенность. FB 3.0.4.33054
Код: sql
1.
  select csn.code || iif(right(csn.code, 1) = '.', '', ' ') || ci.name from ...


Это запрос для формирования строки улицы. csn.code содержит сокращение ("ул.", "б-р" и т.д.), а ci.name это название ("Ленина" и т.д.). Если после сокращения стоит точка, то пишем без пробела, без точки - пробел. Но в данном запросе пробел ставится всегда. Спасает только:
Код: sql
1.
  select csn.code || iif(right(csn.code, 1) = '.', trim(''), ' ') || ci.name from ...


без iif работает нормально, и вот так работает нормально:
Код: sql
1.
select csn.code || iif(1 = 1, '', '') || ci.name from ...


Вот так опять пробел:
Код: sql
1.
select csn.code || iif(1 = 1, '', ' ') || ci.name from ...
...
Рейтинг: 0 / 0
Лишний пробел
    #39895376
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHS_SHS,

Да да, CHAR он такой. А все литералы - CHAR, пока не указано другое.
...
Рейтинг: 0 / 0
Лишний пробел
    #39895395
SHS_SHS,

Глюк, ага. :)

Используй case:

Код: sql
1.
select code || case right(code, 1) when '.' then '' else ' ' end || name from csn
...
Рейтинг: 0 / 0
Лишний пробел
    #39895416
SHS_SHS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пардон, тема оказывается уже старая: Возвращаемый результат функции IIF . Просто первый раз столкнулся.
...
Рейтинг: 0 / 0
Лишний пробел
    #39895430
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Колбаса на виражах
Глюк, ага. :)
Сам ты глюк.
Невежественные дикари всё непонятное тоже объясняли духами и магией.
...
Рейтинг: 0 / 0
Лишний пробел
    #39895594
SHS_SHS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще одна неявная особенность в эту же тему:
Код: sql
1.
2.
select iif(1 = 1, '       ', '') = '' from rdb$database     --> Результат: True
select char_length(iif(1 = 1, '       ', '')) from rdb$database    --> Результат: 7


Т.е. получаем пустую строку размером в 7 символов.

Тоже самое наблюдается в UDR, когда результат функции varchar(). Проверяешь функцию udr_diff(...) <> '', а она должна вернуть пробелы, но строка пустая с размером > 0.
...
Рейтинг: 0 / 0
Лишний пробел
    #39895602
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHS_SHS,

это всё известные особенности и даже документированные
...
Рейтинг: 0 / 0
Лишний пробел
    #39895606
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHS_SHS,

Ууу как всё запущено. Это же основы!
Код: sql
1.
'a     ' = 'a' --> True
...
Рейтинг: 0 / 0
Лишний пробел
    #39895609
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
это всё известные особенности и даже документированные
Особенности - это когда отличается от "стандарта". А тут и есть стандарт :)
...
Рейтинг: 0 / 0
Лишний пробел
    #39895614
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHS_SHS,

в SQL серверах строки сравниваются согласно установленному COLLATE.
По умолчанию (и это по стандарту) при сравнении строк завершающие пробелы игнорируются. Если бы было не так, то ты бы задолбался с типом CHAR.
...
Рейтинг: 0 / 0
Лишний пробел
    #39895631
SHS_SHS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис
это всё известные особенности и даже документированные

Кто ж у нас читает инструкцию до того пока что-то не поломается :). Да если даже и читал, то не запомнилось, т.к. тогда не было необходимости. Так что я не первый, и думаю, не последний, кого удивит такая особенность.
...
Рейтинг: 0 / 0
Лишний пробел
    #39895635
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHS_SHS
Так что я не первый, и думаю, не последний, кого удивит такая особенность.
Кто-то удивляется, что солнце с утра встаёт, а кто-то простым вещам SQL. Не отстреливать же вас, в самом деле.
...
Рейтинг: 0 / 0
Лишний пробел
    #39895642
SHS_SHS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис
в SQL серверах строки сравниваются согласно установленному COLLATE.
По умолчанию (и это по стандарту) при сравнении строк завершающие пробелы игнорируются. Если бы было не так, то ты бы задолбался с типом CHAR.

Ну а тут я задолбался с пробелами:
Код: sql
1.
2.
3.
select cast('a     ' as varchar(6)) = 'a' from rdb$database  --> True (тут еще логично)
select cast('a     ' as char(6)) = 'a' from rdb$database  --> True (тут уже нет т.к.:
select char_length(cast('a     ' as char(10))) from rdb$database  --> 10


Как правильно это проверить?
...
Рейтинг: 0 / 0
Лишний пробел
    #39895645
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHS_SHS,

был тут такой топик пару лет назад.
Тогда пришлось вникнуть в суть вопроса и внести сиё в документацию.
И даже подсказали человеку как COLLATE правильный создать.
Вот только применять его по умолчанию к текущей кодировке не советую, а то много чего поломается. А вот в конкретном месте при сравнении можно
...
Рейтинг: 0 / 0
Лишний пробел
    #39895650
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHS_SHSКак правильно это проверить?

Никогда не использовать CHAR.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Лишний пробел
    #39895656
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHS_SHS,

ты ответы правильно читать можешь?
Разве я тебе сказал, что char решит твои проблемы?
Нет я сказал, что если бы концевые пробелы учитывались при сравнении по умолчанию, то ты бы задолбался с типом char(N), ибо там строки всегда дополняются пробелами до максимальной длины.
...
Рейтинг: 0 / 0
Лишний пробел
    #39895665
SHS_SHS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Никогда не использовать CHAR.

Так я его стараюсь и не использовать, но оказывается что эта особенность и была сделана для CHAR.
Симонов Денис
... Если бы было не так, то ты бы задолбался с типом CHAR.
...
Рейтинг: 0 / 0
Лишний пробел
    #39895673
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHS_SHS,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE COLLATION WIN1251_NOPAD
FOR WIN1251
FROM WIN1251
NO PAD;

select
  'a   ' = 'a' as n1,
  'a   ' = 'a   ' as n2,
  'a   ' collate WIN1251_NOPAD = 'a' collate WIN1251_NOPAD as n3,
  'a   ' collate WIN1251_NOPAD = 'a   ' collate WIN1251_NOPAD as n4
from rdb$database;



Код: plaintext
1.
2.
n1    n2      n3     n4
-------------------------
true  true    false  true
...
Рейтинг: 0 / 0
Лишний пробел
    #39895674
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHS_SHSТак я его стараюсь и не использовать

"Try not. Do or do not. There is no try." (c)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Лишний пробел
    #39895689
SHS_SHS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис
..'a ' collate WIN1251_NOPAD = 'a' collate WIN1251_NOPAD as n3...

Оказывается приклеить пробелы сложнее, чем обрубить :). Спасибо.
...
Рейтинг: 0 / 0
Лишний пробел
    #39895774
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Никогда не использовать CHAR.


А char(1) можно? ;)
...
Рейтинг: 0 / 0
Лишний пробел
    #39895818
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишка
А char(1) можно? ;)
Некоторым даже CHAR(0) можно.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Лишний пробел
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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