Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Сравнение полей с учётом NULL и не только / 4 сообщений из 4, страница 1 из 1
19.08.2009, 10:46
    #36151625
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение полей с учётом NULL и не только
Нашёл способы сравнения довольно простые, на мой взгляд, может кому интересно. Если у кого то есть более красивый способ, было бы интересно узнать.

Сравнение двух ID полей (INT NULLABLE)
Возвращает 'Y', если поля идентичны (либо по значению ID, либо оба NULL).
Главное условие это то, что значение "-1" в VALUE должно быть одинаковое и быть уникальным,
т.е. EXTID1 и EXTID2 не могут иметь значение -1 в таблице.
Код: plaintext
1.
2.
3.
4.
SELECT
  EXTID1, EXTID2,
  CASE WHEN VALUE( EXTID1, - 1  ) = VALUE( EXTID2, - 1  ) THEN 'Y' ELSE 'N' END AS EQFIELDS
  FROM TABLE

Еще потребовалось отлавливать изменение двух полей в триггере:
Поля F1 и F2 рассматриваются вместе и если хотя бы одно из них 'Y', то
суммарный флаг = 'Y', в противном случае 'N'. В триггере требовалось
отловить изменение суммарного флага . Сравнение основано на том,
что если оба флага 'N', то только в этом случае суммарный флаг = 'N'.
Дополнительное условие, F1 и F2 не могут иметь значение NULL (NOT NULL поля).
(мутно наверное объяснил, может пример поможет):
Код: plaintext
1.
2.
3.
4.
5.
6.
    REFERENCING OLD AS O
                      NEW AS N
...
   CASE WHEN LOCATE( 'NN', CONCAT(O.F1,O.F2) ) =
                    LOCATE( 'NN', CONCAT(N.F1,N.F2) ) THEN 'N' ELSE 'Y' END
...
такой способ можно применить и на бОльшем кол-ве полей.
...
Рейтинг: 0 / 0
24.08.2009, 09:00
    #36159191
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение полей с учётом NULL и не только
Тоже есть вопрос по этой теме. Раньше везде в WHERE использовали
Код: plaintext
VALUE(field1,  0 ) = VALUE(param1,  0 )
для того чтобы в выборку попадали записи с нулловским полем при нулловом параметре. Потом переделали на
Код: plaintext
(field1 = param1) OR (field1 IS NULL AND param1 IS NULL)
Хотелось бы узнать, как использование функции VALUE() в WHERE влияет на производительность?

---------------------------------------------------------
IS NULL OR NOT IS NULL
...
Рейтинг: 0 / 0
24.08.2009, 11:30
    #36159438
Vladimir Kiselev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение полей с учётом NULL и не только
BuryCommoner,

Вариант с VALUE получается медленней, что на индексированных, что на неиндексированных полях. Смотрел в DbVisualizer. Реально - не мерял. Хотя я предполагал, что "OR" - сильней тормозить будет.
...
Рейтинг: 0 / 0
25.08.2009, 12:02
    #36161354
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение полей с учётом NULL и не только
Спасибо. Подозревал, что правильнее без VALUE(), но проверить всё некогда было :)

---------------------------------------------------------
IS NULL OR NOT IS NULL
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Сравнение полей с учётом NULL и не только / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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