2010-12-15 2 views
0

Предположим, у вас есть три текстовых поля, которые вы можете использовать для поиска данных. Каждое текстовое поле будет соответствовать столбцу таблицы DB2. Строка поиска, которую вы вводите, будет вставлена ​​в предложение where. Например, у вас есть имя, фамилия и номер телефона. Если вы не вводите данные в конкретное текстовое поле, я по умолчанию его значение в предложении where на «_», символ подстановки, чтобы выбрать все. Кроме того, можно сказать, что номер телефона определен как NULL на столе.Столбцы для обработки DB2, определенные как null

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

Где FIRST_NAME, как: Firstname И LAST_NAME как: Lastname И PHONE_NBR как: количество

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

Cursor2 будет использоваться, если пользователь НЕ ВХОДИТ в телефон номер для поиска ИНЕКЕ выглядит примерно так

Где FIRST_NAME, как:.. Firstname И LAST_NAME как: фамилия и (PHONE_NBR как: номер OR PHONE_NBR IS NULL)

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

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

+0

Не знаете, что вы просите. Второй курсор будет содержать все строки, которые были в первом курсоре плюс любые строки, содержащие NULL для PHONE_NBR. –

ответ

0

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

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

0

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

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

    FIRST_NAME LIKE '...' 
    
  • Если пользователь вводит что-то в текстовом поле Last_name, у вас есть Состояние таких как:

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

    PHONE_NBR LIKE '...' 
    

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

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

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

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

+0

Спасибо за ваши ответы. Я закончил использование IFNULL() в select и where, заменив любое нулевое значение на «0» в этом столбце и временную переменную. Таким образом, в этом случае это будет SELECT ... IFNULL (PHONE_NBR, 0) AS PHONE_NBR ... WHERE (IFNULL (PHONE_NBR, 0) LIKE: номер или IFNULL (PHONE_NBR, 0), например: temp) Если пользователь захотел выполнить поиск для номера телефона, затем я устанавливаю temp = 9, поэтому будет выбран только запрошенный номер телефона. Если номер телефона не был введен, я по умолчанию: number to '_' и set: temp = 0, чтобы было выбрано все, что есть и не равно null. –

Смежные вопросы