powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB2.5 - CASE: автоматическое приведение литеральных констант к типу CHAR()
10 сообщений из 10, страница 1 из 1
FB2.5 - CASE: автоматическое приведение литеральных констант к типу CHAR()
    #38967879
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.

FB2.5

Выполним в ISQL запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> select '<' ||
CON>        case 0
CON>          when 0
CON>          then '12'
CON>          else '1234'
CON>        end ||
CON>        '>'
CON>   from RDB$DATABASE;

CONCATENATION
=============
<12  >


Видно, что результат содержит два лишних концевых пробела. Видимо, из за того, что разница длин между результатом '12' и максимально длинным значением '1234' в ветке CASE составляет как раз 2 символа.

Исправить можно приведением типа CAST( ... AS VARCHAR(...) )

Это ошибка или так и должно быть?

С уважением, Polesov.
...
Рейтинг: 0 / 0
FB2.5 - CASE: автоматическое приведение литеральных констант к типу CHAR()
    #38967901
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

это нормально ибо все строковые литералы имеют тип CHAR(N)
...
Рейтинг: 0 / 0
FB2.5 - CASE: автоматическое приведение литеральных констант к типу CHAR()
    #38967908
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Firebird_2_5\doc\sql.extensions\README.data_type_results_of_aggregations.txt

3) Case:

a) If any of the data types in DTS is character string, then:

1) If all data types in DTS are fixed-length character strings, then the result
is also a fixed-length character string, else a variable-length character
string. The resulting string length in characters is equal to the
maximum of the lengths in characters of the data types in DTS.
...
Рейтинг: 0 / 0
FB2.5 - CASE: автоматическое приведение литеральных констант к типу CHAR()
    #38967910
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

но я не ожидал получить результат с 2-мя лишними концевыми пробелами. Логичнее было бы в данном случае привести результат к типу CHAR(2).

С уважением, Polesov.
...
Рейтинг: 0 / 0
FB2.5 - CASE: автоматическое приведение литеральных констант к типу CHAR()
    #38967911
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

Длина выходного поля определяется на этапе препарирования запроса. А поскольку не факт что там тупое условие 0=0 движок не знает какой получится выходная длина и тупо берёт максимально возможную.
...
Рейтинг: 0 / 0
FB2.5 - CASE: автоматическое приведение литеральных констант к типу CHAR()
    #38967932
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно, спасибо.
...
Рейтинг: 0 / 0
FB2.5 - CASE: автоматическое приведение литеральных констант к типу CHAR()
    #38968268
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
Симонов Денисэто нормально ибо все строковые литералы имеют тип CHAR(N)
А если в коде FB в том месте где указано что все строковые литералы имеют тип CHAR(N), прописать там вместо этого VARCHAR(N)?
Мир не остановится? :)
VARCHAR(N) вроде эффективней чем CHAR(N), т.к. не нужно всё время паддить пробелами. Ну по логике :)

В любом случае - то что словил автор несколько обескураживает. Эдакий "привет всем из семидесятых".
...
Рейтинг: 0 / 0
FB2.5 - CASE: автоматическое приведение литеральных констант к типу CHAR()
    #38968276
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-"привет всем из семидесятых"
пишите письма в спортлото SQL-комитет
...
Рейтинг: 0 / 0
FB2.5 - CASE: автоматическое приведение литеральных констант к типу CHAR()
    #38968280
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
dimitr-"привет всем из семидесятых"
пишите письма в спортлото SQL-комитет
Да я в курсе что они крышуют SQL-сервера :) Хорошая крыша, кстати, в целом :)
...
Рейтинг: 0 / 0
FB2.5 - CASE: автоматическое приведение литеральных констант к типу CHAR()
    #38968440
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-А если в коде FB в том месте где указано что все строковые литералы имеют тип CHAR(N), прописать там вместо этого VARCHAR(N)?
Мир не остановится? :)Для себя имеешь право, берешь исходники и компилируешь для себя приватный билд отклоняющийся от стандарта.

А если по рабочекрестьянски то пишешь в требуемом месте cast к нужному типу и вперед.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB2.5 - CASE: автоматическое приведение литеральных констант к типу CHAR()
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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