Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2018, 18:49   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию Firebird - Не совсем понятна обрезка концевых пробелов

Доброе время суток,
Есть запрос
Код:
select distinct OWNER_DEVICE, ''OWNER_DEVICE'' FILED_NAME from REGISTRATION 
union all
select distinct NAME_DEVICE, ''NAME_DEVICE'' from REGISTRATION 
union all 
select distinct CITY, ''CITY'' from REGISTRATION
после его выполнения в IBQuery, в нем образуются дополнительные концевые пробелы в строках с «NAME_DEVICE» и «CITY».
Причем кол-во пробелов в «NAME_DEVICE» = 1, а в «CITY» = 8.
Как я понял потом это связано с преобразованием Firebird строковых констант в char(maxlength)
Пришлось немного переделать запрос:
Код:
select distinct OWNER_DEVICE, ''OWNER_DEVICE'' FILED_NAME from REGISTRATION 
union all
select distinct NAME_DEVICE, trim(''NAME_DEVICE'') from REGISTRATION 
union all 
select distinct CITY, ''CITY'' from REGISTRATION
После этого пробелы удалились со ВСЕХ значений в поле «FILED_NAME».
Мне казалось, что должно было удалиться только с тех строк, где значение равно ''NAME_DEVICE'', т.е. к определенному значению, а не к полю «FILED_NAME» (в таком случае логичнее было бы значением функции trim указывать название поля)…, но в http://firebirdsql.su/doku.php?id=trim, сказано, что это значение "trim" это «выражение, символы которого нужно обрезать». Как тогда понимать эту запись???

Спасибо за ответ

Последний раз редактировалось KBO; 20.03.2018 в 18:51.
KBO вне форума Ответить с цитированием
Старый 20.03.2018, 19:21   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

http://www.firebirdfaq.org/faq237/
Цитата:
Не совсем понятна обрезка концевых пробелов
а мне непонятна фраза "Не совсем понятна". Это как - ваще не понятно или что за фиг? ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 20.03.2018 в 19:24.
Аватар вне форума Ответить с цитированием
Старый 21.03.2018, 00:01   #3
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Скорее "что за фиг"... ))

почему
Код:
...trim(''NAME_DEVICE'')...
который я приводил в посте №1, действует на поле (т.е. обрезка идет у всех значений строк поля), а не на одно значение (''NAME_DEVICE'')?
KBO вне форума Ответить с цитированием
Старый 21.03.2018, 07:39   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Видимо особенности приведения к одному типу. Надо полагать, что движок в случае когда только константы были тип результирующего поля сделал char. Во втором случае - varchar. Скорее всего это не связано именно с trim. Попробуй LOWER например вместо trim подставить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.03.2018, 09:22   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

trim(''DEVICE'') --здесь trim НИЧЕГО не делает. =''DEVICE''
trim('' NAME_DEVICE '') а здесь кое-что проделает. =''NAME_DEVICE''

trim обрезает ровно то что в скобках(в данном случае константу), но вот потом....

Поле может быть только одного типа. В данном случае
  • или char(maxlen) и тогда у ВСЕХ коротких значений появятся конечные пробелы(дополняющие до нужной длины)
    Цитата:
    Причем кол-во пробелов в «NAME_DEVICE» = 1, а в «CITY» = 8.
  • или varсhar(maxlen) и тогда значение будет РОВНО такое как задали(без конечных дополняющих пробелов).
    Цитата:
    После этого пробелы удалились со ВСЕХ значений в поле «FILED_NAME».
В последнем случае пробелы можно (и нужно) добавить самому (по вкусу)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.03.2018 в 09:29.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отрезок задан координатами своих концевых точек. Требуется вычислить длину этого отрезка - C++ Александр121 Помощь студентам 3 09.02.2018 15:04
Обрезка Sanya.Kushner Мультимедиа в Delphi 1 05.12.2013 20:55
Обрезание "не совсем" пробелов в ячейке spirit-ua Microsoft Office Excel 6 21.07.2011 16:04
Не понятна область действия css класса posdnyaa HTML и CSS 5 19.11.2008 08:56