DB2 - обработка столбцов, определенных как ноль - PullRequest
0 голосов
/ 15 декабря 2010

Допустим, у вас есть три текстовых поля, которые вы можете использовать для поиска данных. Каждое текстовое поле будет соответствовать столбцу в таблице DB2. Введенная вами строка поиска будет вставлена ​​в предложение where. Например, у вас есть имя, фамилия и номер телефона. Если вы не вводите данные в определенное текстовое поле, я по умолчанию устанавливаю его значение в предложении where на '_', подстановочный знак, чтобы выбрать все. Также допустим, что в таблице номер телефона определен как NULL.

Курсор1 будет использоваться, если пользователь ввел номер телефона для поиска. Так что предложение where будет выглядеть примерно так:

Где FIRST_NAME нравится: имя И LAST_NAME, как: фамилия И PHONE_NBR как: номер

Это работает, когда данные вводятся для номера телефона. Но если поиск выполняется только по имени, курсор возвращает частичные результаты или не дает результатов, потому что переменная хоста: number будет заполнена подстановочным знаком "_". PHONE_NBR подобно '_' будет возвращать только те строки, которые имеют действительное значение. Если для строки PHONE_NBR указано значение NULL, совпадающее с именем, которое вы искали, эта строка не будет отображаться. Поэтому я создал второй курсор.

Курсор2 будет использоваться, если пользователь НЕ ввел номер телефона для поиска. Предложение Where выглядит примерно так:

Где FIRST_NAME нравится: имя И LAST_NAME, как: фамилия И (PHONE_NBR как: номер ИЛИ PHONE_NBR = NULL)

Итак, еще раз, если поиск был выполнен только по имени, а некоторые значения в PHONE_NBR имеют данные, некоторые равны нулю, ВСЕ, которое соответствует искомому имени, будет отображаться в результатах - что хорошо. Для строк со значениями в PHONE_NBR, PHONE_NBR как '_' получит их. Для строк с нулем в PHONE_NBR, PHONE_NBR IS NULL получит их.

Это небольшая, но необходимая разница. Из-за этого небольшого различия я хотел бы объединить эти два курсора в один. Как это можно сделать для достижения тех же результатов?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2010

Я бы порекомендовал справиться с этим, построив запрос для предоставления условий только для столбцов, в которые пользователь вводит данные.То есть:

  • Если пользователь вводит что-то в текстовое поле First_Name, у вас есть условие, например:

    FIRST_NAME LIKE '...'
    
  • Еслипользователь вводит что-то в текстовое поле Last_Name, у вас есть условие, такое как:

    LAST_NAME LIKE '...'
    
  • Если пользователь вводит что-то в текстовое поле Phone_Nbr, у вас есть условие, такое как:

    PHONE_NBR LIKE '...'
    

В каждом случае 3 точки представляют строку, полученную из информации, введенной в текстовое поле, и функция, которая выполняет это преобразование, полностью осведомлена о цитировании (чтобы избежать SQLинъекция).

Если пользователь вводит два или три текстовых поля, независимые условия объединяются с помощью AND.Если пользователь ничего не печатает, вы можете сгенерировать тавтологию, например 1 = 1, в качестве условия.

Затем вы добавляете это условие к предложению WHERE инструкции SQL и затем организуете его выполнение.

Это метод, доступный в операторе CONSTRUCT в IBM Informix 4GL;он доступен там с 1986 года. Он допускает условия, отличные от просто LIKE, такие как равные, меньшие, большие или равные диапазонам или даже список альтернатив (для IN ('val1', 'val2'), ...) и может использоваться для всех типов данных.

0 голосов
/ 21 декабря 2010

Ян, я думаю, что разница в том, что пользователь вводит число, которое он не хочет, чтобы строки возвращались с нулем.использование курсора 2 все время будет возвращать строки с нулем вместе с соответствующими номерами.

Вы можете попробовать выражение CASE на основе: число ... хотя я не уверен, что вы можете использовать CASE сСинтаксис "является нулевым".я знаю, что вы могли бы, если бы вы просто проверяли различные значения (равно, меньше, и т. д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...