Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос с условием в условии отбора  [new]
PSdude
Member

Откуда:
Сообщений: 13
Есть запрос для поиска человека по городу, дому и квартире.
Пытаюсь прикрутить к нему итерфейс. Доступа к программированию как к таковому нет (запрос исполняется в чужой программе), могу использовать только средства SQL и входные данные через какую то конструкцию придуманную разработчиками которая выглядит примерно вот так:
{Населённый пункт|varchar}

Это значит что в этом месте будет строчка которую введёт пользователь, в автоматически сконструированный интерфейс.

Вот текст запроса и в принципе он работает:
 Select ManID

FROM dbo.Region

WHERE 
ManID > -1
AND CityName LIKE '%'+{Населенный пункт|varchar}+'%'
AND CAST(Building AS varchar) LIKE CASE {Дом|varchar}
AND Flat LIKE '%'+{Квартира|varchar}+'%'


Но вот проблема: У некоторых людей не занесены квартира, номер дома или город, то есть в этих полях NULL и эти люди тоже должны попадать в результат. В интерфейсе есть ограничение: во все поля обязательно должны быть введены данные. То есть единственный вариант найти человека о котором нам известен только город и квартира - это ввести Название города, номер квартиры, а на месте номера дома поставить символ '%'. Однако в этом случае в результаты запроса не попадут люди с NULL в столбце Building, а нужно чтобы попали.
Можно ли как нибудь решить ткую проблему? Как то сделать, чтобы если пользователь вводит % запрос делал проверку не только Field = % но и проверку Field IS NULL
30 сен 14, 09:50    [16637042]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
WHERE ManID > -1
AND (CityName IS NULL OR CityName LIKE '%'+{Населенный пункт|varchar}+'%')
AND (Building IS NULL OR Building=CAST({Дом|varchar} AS INT))
AND (Flat IS NULL OR Flat=CAST({Квартира|varchar} AS INT))
30 сен 14, 10:04    [16637098]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
iap
WHERE ManID > -1
AND (CityName IS NULL OR CityName LIKE '%'+{Населенный пункт|varchar}+'%')
AND (Building IS NULL OR Building=CAST({Дом|varchar} AS INT))
AND (Flat IS NULL OR Flat=CAST({Квартира|varchar} AS INT))
Или я неправильно понял и всё наоборот?
WHERE ManID > -1
AND ({Населенный пункт|varchar} IS NULL OR CityName LIKE '%'+{Населенный пункт|varchar}+'%')
AND ({Дом|varchar} IS NULL OR Building=CAST({Дом|varchar} AS INT))
AND ({Квартира|varchar} IS NULL OR Flat=CAST({Квартира|varchar} AS INT))
30 сен 14, 10:06    [16637106]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31432
PSdude
Как то сделать, чтобы если пользователь вводит % запрос делал проверку не только Field = % но и проверку Field IS NULL
Так и напишите в условии, в чём трудности?

Непонятно, вы сами запрос конструируете, и как подставляются значения из интерфецса?
Если вышеприведённый текст - это шаблон запроса для вашего приложения, а вместо {Дом|varchar} приложение подставляет значение, то можно изменить шаблон так:

[src]AND (Building LIKE {Дом|varchar} OR {Дом|varchar} = '%'
)[/SRC]
30 сен 14, 10:07    [16637118]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
PSdude
Member

Откуда:
Сообщений: 13
iap
iap
WHERE ManID > -1
AND (CityName IS NULL OR CityName LIKE '%'+{Населенный пункт|varchar}+'%')
AND (Building IS NULL OR Building=CAST({Дом|varchar} AS INT))
AND (Flat IS NULL OR Flat=CAST({Квартира|varchar} AS INT))
[/quot]
В этом случае, даже если пользователь вводит номер дома в результаты попадают люди с NULL в номере дома, такого быть не должно. Жители с NULL должны выводится только если пользователь вместо номера дома ввёл %

[quot iap]
Или я неправильно понял и всё наоборот?
WHERE ManID > -1
AND ({Населенный пункт|varchar} IS NULL OR CityName LIKE '%'+{Населенный пункт|varchar}+'%')
AND ({Дом|varchar} IS NULL OR Building=CAST({Дом|varchar} AS INT))
AND ({Квартира|varchar} IS NULL OR Flat=CAST({Квартира|varchar} AS INT))

А это смысла не имеет, так как интерфейс NULL не пропускает, то есть {Населенный пункт|varchar} никогда не может быть NULL
30 сен 14, 10:25    [16637211]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
PSdude
iap
пропущено...
Или я неправильно понял и всё наоборот?
WHERE ManID > -1
AND ({Населенный пункт|varchar} IS NULL OR CityName LIKE '%'+{Населенный пункт|varchar}+'%')
AND ({Дом|varchar} IS NULL OR Building=CAST({Дом|varchar} AS INT))
AND ({Квартира|varchar} IS NULL OR Flat=CAST({Квартира|varchar} AS INT))


А это смысла не имеет, так как интерфейс NULL не пропускает, то есть {Населенный пункт|varchar} никогда не может быть NULL
А чему он равен? Что мешает подставить нужное значение? Удивляюсь.
30 сен 14, 10:29    [16637239]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
PSdude
Member

Откуда:
Сообщений: 13
iap
WHERE ManID > -1
AND (CityName IS NULL OR CityName LIKE '%'+{Населенный пункт|varchar}+'%')
AND (Building IS NULL OR Building=CAST({Дом|varchar} AS INT))
AND (Flat IS NULL OR Flat=CAST({Квартира|varchar} AS INT))


В этом случае, даже если пользователь вводит номер дома в результаты попадают люди с NULL в номере дома, такого быть не должно. Жители с NULL должны выводится только если пользователь вместо номера дома ввёл %

iap
Или я неправильно понял и всё наоборот?
WHERE ManID > -1
AND ({Населенный пункт|varchar} IS NULL OR CityName LIKE '%'+{Населенный пункт|varchar}+'%')
AND ({Дом|varchar} IS NULL OR Building=CAST({Дом|varchar} AS INT))
AND ({Квартира|varchar} IS NULL OR Flat=CAST({Квартира|varchar} AS INT))

А это смысла не имеет, так как интерфейс NULL не пропускает, то есть {Населенный пункт|varchar} никогда не может быть NULL
30 сен 14, 10:29    [16637240]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
PSdude
Member

Откуда:
Сообщений: 13
iap
А чему он равен? Что мешает подставить нужное значение? Удивляюсь.
Он равен тому что введёт пользователь - либо номеру дома, квартиры, названию города, либо символу % но "ничего не ввести" пользователь не может.
30 сен 14, 10:31    [16637263]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
Glory
Member

Откуда:
Сообщений: 104760
PSdude
. Жители с NULL должны выводится только если пользователь вместо номера дома ввёл %

И что мешает прописать это условие то через OR ?
30 сен 14, 10:31    [16637265]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
PSdude
iap
А чему он равен? Что мешает подставить нужное значение? Удивляюсь.
Он равен тому что введёт пользователь - либо номеру дома, квартиры, названию города, либо символу % но "ничего не ввести" пользователь не может.
{Населенный пункт|varchar}='%' OR CityName LIKE '%'+{Населенный пункт|varchar}+'%'
не работает что ли, я не понимаю?!
Вы вообще программист или нет?
30 сен 14, 10:34    [16637282]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
PSdude
Member

Откуда:
Сообщений: 13
alexeyvg
Непонятно, вы сами запрос конструируете, и как подставляются значения из интерфецса?
Если вышеприведённый текст - это шаблон запроса для вашего приложения, а вместо {Дом|varchar} приложение подставляет значение, то можно изменить шаблон так:

[src]AND (Building LIKE {Дом|varchar} OR {Дом|varchar} = '%'
)[/SRC]

Значения подставляются из интерфейса. Проблема в том что если делаешь сравнение с % то в результат запроса не попадают значения с NULL
30 сен 14, 10:35    [16637294]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
PSdude
alexeyvg
Непонятно, вы сами запрос конструируете, и как подставляются значения из интерфецса?
Если вышеприведённый текст - это шаблон запроса для вашего приложения, а вместо {Дом|varchar} приложение подставляет значение, то можно изменить шаблон так:

[src]AND (Building LIKE {Дом|varchar} OR {Дом|varchar} = '%'

)[/SRC]

Значения подставляются из интерфейса. Проблема в том что если делаешь сравнение с % то в результат запроса не попадают значения с NULL
Почему?

P.S. У Вас правой закрывающей скобки не хватает.
30 сен 14, 10:36    [16637303]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
iap
P.S. У Вас правой закрывающей скобки не хватает
Простите. Не заметил :((
30 сен 14, 10:37    [16637310]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
PSdude
Member

Откуда:
Сообщений: 13
iap
PSdude
пропущено...

Значения подставляются из интерфейса. Проблема в том что если делаешь сравнение с % то в результат запроса не попадают значения с NULL
Почему?

P.S. У Вас правой закрывающей скобки не хватает.


Думаю потому что, сравнение с NULL всегда выдаёт FALSE если только не делаешь его через IS
30 сен 14, 10:41    [16637333]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
Glory
Member

Откуда:
Сообщений: 104760
PSdude
Думаю потому что, сравнение с NULL всегда выдаёт FALSE если только не делаешь его через IS

Какое сравнение с NULL происходит при OR {Дом|varchar} = '%' ?
30 сен 14, 10:42    [16637344]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
PSdude
Member

Откуда:
Сообщений: 13
iap
не работает что ли, я не понимаю?!
Вы вообще программист или нет?

Не работает - выдаёт каждый раз и тех кого надо и людей с NULL.
PS По должности не программист, но вариантов нет, приходится делать самому.
30 сен 14, 10:42    [16637345]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31432
PSdude
Думаю потому что, сравнение с NULL всегда выдаёт FALSE если только не делаешь его через IS
В моём варианте нету сравнения с NULL, почему он то не работает???
30 сен 14, 10:43    [16637352]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
PSdude
iap
пропущено...
Почему?

P.S. У Вас правой закрывающей скобки не хватает.


Думаю потому что, сравнение с NULL всегда выдаёт FALSE если только не делаешь его через IS
Но OR пропустит эту запись, потому что {Дом|varchar} = '%', независимо от значения Building.
Вы как себе представляете операторы AND и OR?

Да, и сравнение с NULL НИКОГДА НЕ выдаёт FALSE, потому что выдаёт UNKNOWN
Читайте про троичную логику.
30 сен 14, 10:45    [16637361]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
PSdude
Member

Откуда:
Сообщений: 13
alexeyvg
PSdude
Думаю потому что, сравнение с NULL всегда выдаёт FALSE если только не делаешь его через IS
В моём варианте нету сравнения с NULL, почему он то не работает???
Прошу прощения! Вот он то как раз и работает) Сперва невнимательно посмотрел и подумал что там то же самое что у первого предложившего и не стал пробовать. Ещё раз прошу прощения.
30 сен 14, 10:58    [16637428]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с условием в условии отбора  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
PSdude
alexeyvg
пропущено...
В моём варианте нету сравнения с NULL, почему он то не работает???
Прошу прощения! Вот он то как раз и работает) Сперва невнимательно посмотрел и подумал что там то же самое что у первого предложившего и не стал пробовать. Ещё раз прошу прощения.
Мы разве не об этом до сих пор разговаривали 16637282?

alexeyvg, прошу прощения, что я, оказывается, повторил Ваш пост.
Просто заменил сравнение с NULL на сравнение с '%' после возмущённого поста автора.
30 сен 14, 11:06    [16637468]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить