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

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
25.05.2015, 14:34
    #38967901
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FB2.5 - CASE: автоматическое приведение литеральных констант к типу CHAR()
Polesov,

это нормально ибо все строковые литералы имеют тип CHAR(N)
...
Рейтинг: 0 / 0
25.05.2015, 14:39
    #38967908
o_v_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FB2.5 - CASE: автоматическое приведение литеральных констант к типу CHAR()
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
25.05.2015, 14:41
    #38967910
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FB2.5 - CASE: автоматическое приведение литеральных констант к типу CHAR()
Симонов Денис,

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

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

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

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

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


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