Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > substring в FireBird


Автор: holodnaya 15.11.2009, 23:55
Добрый вечер! 
Работаю c FireBird-2.1.3.  В запросе мне нужно выбрать фамилию и инициалы, пишу следующее
Код

select st.lastname || ' ' || substring(st.name, 1, 1) || '.' || substring(st.otchestvo, 1, 1) ||'.' FIO
from Table1 st

при попытке выполнить запрос, вижу следующее сообщение 
Код

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, char 47.

Вобщем, ругается именно на функцию substring. 
Как мне правильно напистаь запрос?

Автор: Gluttton 16.11.2009, 00:03
Попробуй так:

Код

select 
    st.lastname || ' ' || 
    substring(st.name from 1 for 1) || '.' || 
    substring(st.otchestvo from 1 for 1) ||'.' FIO
from Table1 st


http://www.firebirdsql.su/doku.php?id=substring

Автор: Данкинг 16.11.2009, 00:32
Gluttton, да, верно, сейчас проверил - работает:
Код

select substring(addr from 1 for 5) from base

 smile 

Автор: holodnaya 16.11.2009, 10:31
Спасибо! Вечером приду домой, перепишу. И спасибо за ссылку, будет где посмотреть и другие операторы smile

Автор: Akella 16.11.2009, 12:30
Цитата(holodnaya @  15.11.2009,  23:55 Найти цитируемый пост)
substring(st.name, 1, 1)

а где ты вычитала такой синтаксис?

Автор: holodnaya 18.11.2009, 00:16
Цитата(Akella @  16.11.2009,  12:30 Найти цитируемый пост)
а где ты вычитала такой синтаксис? 

В книжке "FireBird 1.5 быстрый старт" (для более поздней версии подобной книжки у меня нет) в разделел FireBird SQL  написано: "FireBird наиболее строгим образом соответсвует стандарту SQL" (по сравнению с другими СУБД).
И так как больше никаких описаний я не встречала про оператор sub и  substring кроме как указания в скобках (строка, начало_позиции, кол-во_символов), то решила, что это и есть стандартный (неизмененный оператор). Но мои предположения оказались не совсем верными. Сейчас у меня есть ссылка на язык SQL, используемый именно в FireBird, буду разбираться.

Автор: Данкинг 18.11.2009, 00:32
Цитата(holodnaya @  18.11.2009,  00:16 Найти цитируемый пост)
"FireBird наиболее строгим образом соответсвует стандарту SQL" 

А непосредственно substring-то при чём тут: это всё же не SQL-оператор.

Автор: holodnaya 18.11.2009, 00:38
Цитата(Данкинг @  18.11.2009,  00:32 Найти цитируемый пост)
А непосредственно substring-то при чём тут: это всё же не SQL-оператор.

А что это? И почему тогда в IBExoert при написании SQL - запроса он сам этот оператор подставляет?

Автор: Данкинг 18.11.2009, 00:54
Цитата(holodnaya @  18.11.2009,  00:38 Найти цитируемый пост)
А что это?

Я вот затрудняюсь сказать, что такое  Substring  применительно к FB. smile Может быть, Akella подскажет. Я бы сказал так: функция встроенного языка FB. К примеру, в Access тоже ведь можно использовать Mid, но это же не SQL-оператор Access'а как такового, а оператор VBA (и VB). smile 

Автор: holodnaya 18.11.2009, 01:17
Цитата(Данкинг @  18.11.2009,  00:32 Найти цитируемый пост)
А непосредственно substring-то при чём тут: это всё же не SQL-оператор.

А что тогда? И почему в IBExpert автоматически подставляется при написании SQL запроса в SQL Editor?

Автор: Akella 18.11.2009, 10:20
Цитата(holodnaya @  18.11.2009,  00:16 Найти цитируемый пост)
В книжке "FireBird 1.5 быстрый старт" (для более поздней версии подобной книжки у меня нет)

Зато есть
Firebird 2.0 Release Notes
Firebird 2.1 Release Notes
и т.д.  smile

Firebird SUBSTRING
http://firebirdsql.su/doku.php?id=substring


Есть ещё документация
%firebird%\doc\sql.extensions\README.builtin_functions.txt 
%firebird% - папка, где установлен firebird sql сервер


Цитата(Данкинг @  18.11.2009,  00:32 Найти цитируемый пост)
А непосредственно substring-то при чём тут: это всё же не SQL-оператор.

Правильно, substring - это встроенная функция.


Цитата(Данкинг @  18.11.2009,  00:54 Найти цитируемый пост)
Я бы сказал так: функция встроенного языка FB. 

Наверное, не языка, а sql-сервера.

Добавлено через 10 минут и 22 секунды
Цитата(holodnaya @  18.11.2009,  01:17 Найти цитируемый пост)
И почему в IBExpert автоматически подставляется при написании SQL запроса в SQL Editor?

Потому что разработчики постарались, чтобы тебе и мне и всем было легче.

Автор: holodnaya 18.11.2009, 12:37
Цитата(Akella @  18.11.2009,  10:20 Найти цитируемый пост)
Потому что разработчики постарались, чтобы тебе и мне и всем было легче.

Я понимаю назначение автоматической подстановки. Смысл вопрос был немножко другой: если это не SQL-функция, то почему подставляется в редакторе SQL запроса. 

Автор: Данкинг 18.11.2009, 13:07
Цитата(holodnaya @  18.11.2009,  12:37 Найти цитируемый пост)
Смысл вопрос был немножко другой: если это не SQL-функция, то почему подставляется в редакторе SQL запроса.  

Во-первых, а где ей ещё подставляться-то? Во-вторых, потому что ты эту самую функцию sql-сервера включаешь в запрос. 

Автор: holodnaya 18.11.2009, 14:26
Данкинг, я поняла насчет функций ) Спасибо
Ещё вопрос. Если в запросе выбираешь текстовое поле, то под него выделяется столько символов, сколько изначально зарезервировано, что при выводе результатов завпроса в какой-нибудь отчет не очень удобно. Например, в Pole1 char(20), а на самом деле туда записана фамилия из 10 символов и при конкатенации строк получаются очень большие пробелы.
Какую функцию (оператор) можно использовать в этом случае?


Автор: Данкинг 18.11.2009, 14:47
Цитата(holodnaya @  18.11.2009,  14:26 Найти цитируемый пост)
Какую функцию (оператор) можно использовать в этом случае?

trim ? smile 

Автор: Akella 18.11.2009, 18:02
Цитата(holodnaya @  18.11.2009,  14:26 Найти цитируемый пост)
Например, в Pole1 char(20),

всегда используй varchar

Автор: Deniz 19.11.2009, 06:40
Плюсов от использования char, по сравнению с varchar нет.

Автор: holodnaya 21.11.2009, 22:36
Цитата(Данкинг @  18.11.2009,  14:47 Найти цитируемый пост)
Цитата(holodnaya @  18.11.2009,  14:26 )
Какую функцию (оператор) можно использовать в этом случае?


trim ?

Правда trim  smile 
Почему-то в прошлый раз она не сработала  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)