powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите строчку сравнить
25 сообщений из 38, страница 1 из 2
Помогите строчку сравнить
    #38688290
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.

Помогите с такой засадой. Надо в процедуре выбирать данные в зависимости от параметра (строка). Если параметр пустой (не NULL, просто пустая строка) - выбирать все, если в параметре что-то есть, выбирать по маске.

Пытаюсь сделать простой селект (пока ещё не в процедуре, просто в ibexpert-е):

Код: sql
1.
2.
3.
Select symbol, symbol_name
From TTT
where upper(symbol_name) like case coalesce(:name, '') when '' then upper(symbol_name) else upper(:name) end



фигня какая-то. Если name пустой - всё выбирается. Если что-то есть (например, 'A%') - высыпается ошибка:
Код: plaintext
1.
2.
3.
4.
Incompatible column/host variable data type.
Dynamic SQL Error.
SQL error code = -303.
arithmetic exception, numeric overflow, or string truncation.
string right truncation.

Не могу понять, что с чем не совместимо? :name имеет тип VARCHAR(31). Колонка symbol_name - тоже.

То же самое для целочисленных значений работает норм
Код: sql
1.
2.
3.
4.
Select symbol, symbol_name
From TTT
where
symbol = case coalesce(:IN_SYMBOL_ID, 0) when 0 then symbol else :IN_SYMBOL_ID end
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688299
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thНадо в процедуре выбирать данные в зависимости от параметра (строка).
Обоснуй выделенное.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688301
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, 13th!
You wrote on 4 июля 2014 г. 17:50:51:

13th> where upper(symbol_name) like case coalesce(:name, '') when '' then upper(symbol_name) else upper(:name) end
бессмысленный набор букв
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688320
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Хочу весь SQL вынести из cpp-кода. Не удобно писать, отлаживать. Хочу уйти от методики сборки SQL-выражений на стороне клиент - считаю это плохим стилем.
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688321
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thВсем привет.

Помогите с такой засадой. Надо в процедуре выбирать данные в зависимости от параметра (строка). Если параметр пустой (не NULL, просто пустая строка) - выбирать все, если в параметре что-то есть, выбирать по маске.



Ну так выбирай по маске всегда
(заменяй пустую строку параметра на '%' перед селектом)
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688322
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий, ну, я раньше на T_SQL писал. Если это - бессмыслица, покажи как надо, о великий мастер.
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688324
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thМимопроходящий, ну, я раньше на T_SQL писал. Если это - бессмыслица, покажи как надо, о великий мастер.

и там нет логических операций?
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688326
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7m, проблема, как раз, не с пустой строкой, а с заполненной. Почитай внимательно.
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688327
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, 13th!
You wrote on 4 июля 2014 г. 18:25:40:

13th> ну, я раньше на T_SQL писал.
и для T-SQL это бессмыслица.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688328
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7mи там нет логических операций?
они там есть. Ты клонишь к тому, что бы написать
if длина_строки < 1 then шаблон='%'

Select ... where SYMBOL_NAME LIKE шаблон.

но у меня выборки не только по строковым значениям. по целым, по даблам, по датам/времени. Хочу написать единообразный код.
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688329
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thХочу весь SQL вынести из cpp-кода. Не удобно писать, отлаживать. Хочу уйти от
методики сборки SQL-выражений на стороне клиент - считаю это плохим стилем.
Перехоти. Удобства это не прибавит. Стиль как стиль.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688332
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thХочу написать единообразный код
тогда пиши так:
Код: sql
1.
2.
3.
4.
IF (param = '') THEN
   FOR SELECT ...... INTO .... DO ....
ELSE
   FOR SELECT ...... WHERE FIELD STARTING WITH :param INTO ..... DO ....


Что я там выше сказал про удобство и простоту?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688334
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thm7m, проблема, как раз, не с пустой строкой, а с заполненной. Почитай внимательно.
у меня не хватает терпения вчитываться в вот такое
Код: sql
1.
where upper(symbol_name) like case coalesce(:name, '') when '' then upper(symbol_name) else upper(:name) end



13thm7mи там нет логических операций?
они там есть. Ты клонишь к тому, что бы написать
if длина_строки < 1 then шаблон='%'

Select ... where SYMBOL_NAME LIKE шаблон.

но у меня выборки не только по строковым значениям. по целым, по даблам, по датам/времени. Хочу написать единообразный код.

таки да
или
Код: sql
1.
2.
if шаблон='' then шаблон='%'
Select ... where SYMBOL_NAME LIKE шаблон.


но тогда записи с SYMBOL_NAME равными NULL не попадут в выборку
или
Код: sql
1.
Select ... where :шаблон='' or SYMBOL_NAME LIKE :шаблон


впрочем и первый и второй вариант гарантирует не использование индексов и соответственно
тормоза при выборке из большой таблицы (если конечно не будет дополнительных условий выборки)
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688336
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovПерехоти. Удобства это не прибавит. Стиль как стиль.

Проекта моего ты в глаза не видел. Даже не знаешь, сколько у меня таких процедур получится - 4 или 400. Даже не знаешь, в результате чего такое решение было принято и как обосновывалось. И так дерзко: "перехоти". Достаточно самоуверенно. Или обоснуй, или не засирай в мой тред.
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688337
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Код: sql
1.
2.
3.
4.
IF (param = '') THEN
   FOR SELECT ...... INTO .... DO ....
ELSE
   FOR SELECT ...... WHERE FIELD STARTING WITH :param INTO ..... DO ....


Что я там выше сказал про удобство и простоту?..


Ух ты, а я то и не догадался... А как это будет выглядеть для 6 параметров?
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688344
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7m,

Если тебе удобнее, пусть будет так:
Код: sql
1.
where symbol_name like case :name when '' then symbol_name else :name end
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688345
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thИли обоснуй, или не засирай в мой тред.
Обосновываю: читай внимательно сообщение m&m. Особенно внимательно - в месте про
использование индексов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688348
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7mвпрочем и первый и второй вариант гарантирует не использование индексов и соответственно
тормоза при выборке из большой таблицы (если конечно не будет дополнительных условий выборки)

Поясни: оператор LIKE или CASE отрубает индексы? Я в IB не большой спец, но в MS сервере что LIKE, что CASE вполне работал по индексам ещё в версии 6.0.
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688350
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thв MS сервере что LIKE, что CASE вполне работал по индексам ещё в версии 6.0.
Врёшь. Покажи план твоего запроса из предыдущего поста в MS SQL.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688355
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thm7mвпрочем и первый и второй вариант гарантирует не использование индексов и соответственно
тормоза при выборке из большой таблицы (если конечно не будет дополнительных условий выборки)

Поясни: оператор LIKE или CASE отрубает индексы? Я в IB не большой спец, но в MS сервере что LIKE, что CASE вполне работал по индексам ещё в версии 6.0.
LIKE с параметром индекс "отрубает"
LIKE с константой 'AA%' равносилен STARTING WITH и использует индекс (впрочем я в этом не совсем уверен, а искать или пробовать лень)

про остальное (CASE, MSSQL) не знаю
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688362
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7mLIKE с параметром индекс "отрубает"
LIKE с константой 'AA%' равносилен STARTING WITH и использует индекс (впрочем я в этом не совсем уверен, а искать или пробовать лень)
Блин, засада. Ладно, спасибо, с этим понятно, переделаю запрос в STARTING WITH.
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688372
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Модератор: Предупреждение. Если позволишь себе тут пИсаться в таком стиле - лучше сразу иди на другой форум.
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688375
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thm7mLIKE с параметром индекс "отрубает"
LIKE с константой 'AA%' равносилен STARTING WITH и использует индекс (впрочем я в этом не совсем уверен, а искать или пробовать лень)
Блин, засада. Ладно, спасибо, с этим понятно, переделаю запрос в STARTING WITH.
Ну тогда и заботиться о пустой строке не надо будет
ибо
Код: sql
1.
where  symbol_name STARTING WITH :param 


должен работать и при param=''
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688380
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7mдолжен работать и при param=''
Но результат будет сильно зависеть от версии сервера и, возможно, коллейта.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите строчку сравнить
    #38688391
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m7mдолжен работать и при param=''
Да, работает, я уже проверил.

Кстати, выражение
Код: sql
1.
2.
3.
4.
5.
Select symbol, symbol_name
From TTT
where
    symbol = case :IN_SYMBOL_ID when 0 then symbol else :IN_SYMBOL_ID end
    and symbol_name starting with :IN_SYMBOL_NAME



всёж использует индекс:

Код: plaintext
1.
Plan
PLAN (TTT INDEX (SYMBOL1_IDX))

Так что не всё пропало (:
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите строчку сравнить
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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