SQL Преобразование нулевого значения Access DB в пустую строку

Я застрял, пытаясь исправить эту ошибку, и слишком долго занимался этим. Я много искал в Google и искал этот сайт, но, похоже, не могу найти правильный ответ для себя, хотя существует много разных вариантов этого вопроса.

Я пишу графический интерфейс переднего плана, используя VB.Net с базой данных Access на заднем конце. БД имеет значения NULL в PartnerFirstName, PartnerLastName и Organization в моей таблице партнеров. Я загружаю их в Datatable в своем приложении, чтобы пользователь мог их искать. Я только что узнал на прошлой неделе, что некоторые партнеры (со значениями NULL) не загружаются.

Код ниже:

("SELECT IDPartner, IIF(ISNULL(PartnerFirstName),'',PartnerFirstName) as PartnerFirstName, IIF(ISNULL(PartnerLastName), '', PartnerLastName) AS PartnerLastName, IIF(ISNULL(Organization), '', Organization) AS Organization, " & _
        "Address1, City, State, Zip, Country, Active " & _
 "FROM tblPartner " & _
 "WHERE IDPartner like '%" & txtPartnerID.Text & "%' AND " & _
 "      PartnerFirstName like '%" & txtFirstName.Text & "%' AND " & _
 "      PartnerLastName like '%" & txtLastName.Text & "%' AND " & _
 "      Organization like '%" & txtOrganization.Text & "%' AND " & _
 "      Address1 like '%" & txtStreet.Text & "%' AND " & _
 "      City like '%" & txtCity.Text & "%' AND " & _
 "      State like '%" & txtState.Text & "%' AND " & _
 "      Zip like '%" & txtZipCode.Text & "%' AND " & _
 "      Country like '%" & txtCountry.Text & "%' " & _
 "ORDER BY IDPartner, partnerlastname, partnerfirstname", cn)

Причина для like заключается в том, что я хочу, чтобы поиск обновлялся в режиме реального времени на основе значений текстового поля формы. Это источник моей проблемы, поскольку по умолчанию они пусты, а в БД есть нули.

===================

РЕДАКТИРОВАТЬ:

Спасибо за первоначальные комментарии. Теперь я понимаю, что использовал неправильную функцию. IIF, предложенный Баро, теперь помогает мне разобраться с SQL, и это здорово!

Похоже, проблема, с которой я сталкиваюсь, когда записи не отображаются, связана с моим предложением WHERE. Если я удалю это, все записи загрузятся в мою таблицу данных. Когда я включаю предложение Where, как показано, записи будут исключаться со значениями NULL.

Я пытался использовать OR PartnerFirstName IS NULL (а также другие поля), но это оставляет слишком много дополнительных результатов, которые также имеют значения NULL. Я не могу понять, что делать, чтобы разрешить поиск теперь, когда я знаю, что проблема в разделе «Где» инструкции.


person mrmiller1023    schedule 20.01.2016    source источник
comment
Это SQL Server или Access? Это не одно и то же. Статья MSDN, на которую вы ссылаетесь, предназначена для SQL Server. В Access эквивалентом является функция Nz.   -  person Rabbit    schedule 20.01.2016
comment
Попробуйте с: IIF(ISNULL(PartnerFirstName),'',PartnerFirstName)... а затем исправьте свой первый лайк, вы пропустили AND.   -  person Baro    schedule 20.01.2016
comment
вам нужно увидеть, что запрос выполняется для Access; Access не имеет второго параметра для ISNULL   -  person techspider    schedule 20.01.2016


Ответы (2)


Проблема в том, что предикат WHERE нацелен на исходные поля, к которым не применялось выражение IIF(ISNULL(...)). Это трудно увидеть, потому что вы назвали поле в операторе SELECT таким же именем, как и базовое поле. Таким образом, запрос делает то, что вы ему сказали, хотя и не то, что вы хотели. Для решения я бы использовал подзапрос, который преобразует значения NULL в пустые строки, а затем во внешнем запросе добавляет ваш предикат WHERE. Что-то вроде следующего должно помочь:

("SELECT q.* FROM (SELECT IDPartner, IIF(ISNULL(PartnerFirstName),'',PartnerFirstName) as PartnerFirstName, IIF(ISNULL(PartnerLastName), '', PartnerLastName) AS PartnerLastName, IIF(ISNULL(Organization), '', Organization) AS Organization, " & _
        "Address1, City, State, Zip, Country, Active " & _
 "FROM tblPartner) q " & _
 "WHERE q.IDPartner like '%" & txtPartnerID.Text & "%' AND " & _
 "      q.PartnerFirstName like '%" & txtFirstName.Text & "%' AND " & _
 "      q.PartnerLastName like '%" & txtLastName.Text & "%' AND " & _
 "      q.Organization like '%" & txtOrganization.Text & "%' AND " & _
 "      q.Address1 like '%" & txtStreet.Text & "%' AND " & _
 "      q.City like '%" & txtCity.Text & "%' AND " & _
 "      q.State like '%" & txtState.Text & "%' AND " & _
 "      q.Zip like '%" & txtZipCode.Text & "%' AND " & _
 "      q.Country like '%" & txtCountry.Text & "%' " & _
 "ORDER BY q.IDPartner, q.partnerlastname, q.partnerfirstname", cn)
person Tim Lentine    schedule 20.01.2016
comment
Спасибо, Тим, я решил проблему, выполнив запрос на обновление в своей БД, чтобы обновить все поля NULL до . NULLS — это результат неверных данных, внесенных в таблицу во время недавнего перехода на новую систему. - person mrmiller1023; 20.01.2016
comment
NULL и означают две совершенно разные вещи, поэтому просто обновите NULL, чтобы изменить значение данных. В вашем случае это МОГУТ БЫТЬ, что означает, что мы спросили парня, и он говорит, что у него нет партнера, где NULL означает МОГУТ О, дерьмо, мы забыли спросить. - person Jeroen; 21.01.2016
comment
Jeroen, я понимаю, что вы говорите, и я знаю о различиях между NULL и . В данном случае я работаю с этой БД уже 6 лет и переделываю ее. Хотя я признаю, что разница между двумя типами более чем достаточна для того, что мы здесь делаем. - person mrmiller1023; 22.01.2016

Спасибо всем за вашу помощь и предложения, я многому научился из нескольких предложений и очень ценю это!

Я решил проблему, вернувшись в Access. Я выполнил запрос на обновление для любого поля NULL и изменил его на «». Такое простое решение!

Если бы у меня не было требований WHERE, которые я делаю, это не было бы такой большой проблемой.

person mrmiller1023    schedule 20.01.2016