Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Порядок выполнения логических операций / 3 сообщений из 3, страница 1 из 1
16.07.2010, 12:05
    #36744838
dronNN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения логических операций
DB2 9.5 LUW
Есть табличка с двумя столбцами С1 - VARCHAR, C2 - INTEGER. Нужно посчитать все строки, в котором на позиции C2 в строке С1 находится символ 'X'. При этом значение С2 может быть меньше нуля или больше длины С1 - такие строки считать не надо. Простейший запрос:
SELECT COUNT(C1) where SUBSTR (C1, C2,1) = 'X' and C2>0 and C2<=LENGTH(C1)
Проблема: в тех строках, где С2 выходит за установленные пределы, SUBSTR все равно пытается считаться и получаем ошибку.
Изменяю заппрос, ставлю скобки, надеюсь, что проверка С2 произойдет раньше
SELECT COUNT(C1) where (C2>0 and C2<=LENGTH(C1)) and SUBSTR (C1, C2,1) = 'X'
Но... оптимизатор слишком умный и все равно проверяет SUBSTR сначала.
На самом деле табличка сложнее и С2 - вычисляемый параметр, вместо = 'X' реально IN (....), еще есть GROUP BY ROLLUP, но смысл проблемы именно такой.
В реальной базе ставлю GROUP BY - все работает, добавляю GROUP BY ROLLUP - оптимизатор умничает.....

Вопрос : как заставить db2 следовать моему порядку и не пытаться вычислить SUBSTR для недопустимых значений?
...
Рейтинг: 0 / 0
16.07.2010, 17:53
    #36745749
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения логических операций
Код: plaintext
... where substr(c1, case when c2 between  1  and length(c1) then c2 end,  1 )='X'
но: если база в utf-8 и в c1 возможны не ascii символы, но надо по-другому.
...
Рейтинг: 0 / 0
19.07.2010, 12:09
    #36747822
dronNN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок выполнения логических операций
Марк, спасибо! База в 1251, так что по-другому и не надо.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Порядок выполнения логических операций / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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