powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как параметризовать запрос по условию is null / is not null ?
19 сообщений из 19, страница 1 из 1
Как параметризовать запрос по условию is null / is not null ?
    #39702096
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предположим, что в некой таблице есть некое поле (это из разряда фантастики, но все же предположим).
Как написать параметризуемый запрос, который позволит как искать данные по точному вхождению этих полей, так и по условию null/not null ?

where Value=@Param1 не подходит.
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702109
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а, ну и чтобы было достаточно производительным при поиске - читай индексы.
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702131
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreчитай индексы.Тогда так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select
 ...
from
 ...
where
 @Param is null and
 Value is null

union all

select
 ...
from
 ...
where
 @Param is not null and
 Value = @Param

Или так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
 ...
from
 ...
where
 (@Param is null and Value = is null) or
 (@Param is not null and Value = @Param)
option
 (recompile)

Или строить динамический запрос.
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702143
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вариант с union all что-то совсем не нравится.
Во первых. параметр такой (который нужно проверять на null или реальное значение) может быть не один. А значит, что количество запросов будет степенью двойки от числа этих параметров.....
Во вторых. Кроме этого параметра есть же и другие, принимающие участие. А это значит, что база будет вынуждена прогнать два сложных запроса и потом еще объединить результаты через distinct.

Во втором случае тоже не очень ясно. У нас имеется 3 ситуации: заполнено, не заполнено, конкретное значение. В примере обрабатывается только is null + точное знаничение. А вот как вписать в это третий вариант с not null ?

Динамический запрос тоже не очень нравится. Хотелось как раз уйти от этого. Динамический запрос то я могу и так построить хоть весь, с рекомпилом. Если придется часть строить динамически, а часть параметрами, то проще наверное уж строить динамически весь (ну имеется ввиду, что все равно используя параметры, но в динамически сгенеренном запросе)
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702150
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmWaspNewCoreчитай индексы.Тогда так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select
 ...
from
 ...
where
 @Param is null and
 Value is null

union all

select
 ...
from
 ...
where
 @Param is not null and
 Value = @Param

Или так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select
 ...
from
 ...
where
 (@Param is null and Value is null) or
 (@Param is not null and Value = @Param)
option
 (recompile)

Или строить динамический запрос.

Value = is null исправил
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702169
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreВо втором случае тоже не очень ясно. У нас имеется 3 ситуации: заполнено, не заполнено, конкретное значение.Чем, с точки зрения значения параметра, отличается "заполнено" от "конкретное значение"?
256kValue = is null исправилСпасибо.
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702172
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreпараметризуемый запрос, который позволит как искать данные по точному вхождению этих полей, так и по условию null/not null ?

where Value=@Param1 не подходитНу то, что Value - это поле, вроде понятно. Что @Param - параметр, тоже понятно. Что в @Param передаётся значение для поиска - и это понятно. А что будет передаваться, чтобы искать IS NULL (вероятно, NULL), и особенно интересно, что будет передаваться, если надо искать NOT NULL?
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702179
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaWaspNewCoreпараметризуемый запрос, который позволит как искать данные по точному вхождению этих полей, так и по условию null/not null ?

where Value=@Param1 не подходитНу то, что Value - это поле, вроде понятно. Что @Param - параметр, тоже понятно. Что в @Param передаётся значение для поиска - и это понятно. А что будет передаваться, чтобы искать IS NULL (вероятно, NULL), и особенно интересно, что будет передаваться, если надо искать NOT NULL?

У меня тоже такой вопрос. Думал о разных вариантов - как например передача еще доп параметра, указывающего как трактовать. Но поэтому и спросил тут.
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702181
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только так думаю
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
create proc dbo.GetData
    @Param1 int = null
  , @Param1Mode tinyint
  , @Param2 int = null
  , @Param2Mode tinyint 
as 
/* param mode:
    1 - null 
    2 - not null
    3 - value
*/
    select *
    from dbo.Table1 t
    where ( 
               @Param1Mode1 = 1 and Value1 is null 
            or @Param1Mode1 = 2 and Value1 is not null
            or @Param1Mode1 = 3 and Value1 = @Param1
        )
        and ( 
               @Param1Mode2 = 1 and Value2 is null 
            or @Param1Mode2 = 2 and Value2 is not null
            or @Param1Mode2 = 3 and Value2 = @Param2
        )
        -- ...
    option ( recompile );

go
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702183
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invmWaspNewCoreВо втором случае тоже не очень ясно. У нас имеется 3 ситуации: заполнено, не заполнено, конкретное значение.Чем, с точки зрения значения параметра, отличается "заполнено" от "конкретное значение"?

Ну если мы хотим найти тех юзеров, у которых это поле в принципе заполнено, не важно чем. Либо если ищем тех чье значение нам точно известно и их хотим найти. Это разные ситуации поиска. Найти всех кто хотя бы раз "что-то там, что привело к заполнению поля" и тех, кто "что-то там ровно 3 раза".
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702190
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreДумал о разных вариантов - как например передача еще доп параметра, указывающего как трактовать.Теоретически у Value обязан быть некий смысл. А в его рамках обязано существовать некое невозможное значение. Именно такое значение можно использовать как признак "дай мне NOT NULL". Тогда всё превратится в некое (с точностью до синтаксиса)
Код: sql
1.
2.
3.
4.
WHERE CASE WHEN @Param IS NULL         THEN Value IS NULL
           WHEN @Param = @NotNullConst THEN Value IS NOT NULL
                                       ELSE Value = @Param
           END

Для MS SQL видимо нужно обернуть значения-проверки в IF().
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702191
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaWaspNewCoreпараметризуемый запрос, который позволит как искать данные по точному вхождению этих полей, так и по условию null/not null ?

where Value=@Param1 не подходитНу то, что Value - это поле, вроде понятно. Что @Param - параметр, тоже понятно. Что в @Param передаётся значение для поиска - и это понятно. А что будет передаваться, чтобы искать IS NULL (вероятно, NULL), и особенно интересно, что будет передаваться, если надо искать NOT NULL?Это же очевидно.
Параметр должен быть строковым и содержать 'NULL', 'NOT NULL' или конкретные значения.
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702195
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapПараметр должен быть строковым
Только может для строковых параметров стработает, и то с натяжкой, может кто-то захочет искать NULL?
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702197
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир ЗатуливетерiapПараметр должен быть строковым
Только может для строковых параметров стработает, и то с натяжкой, может кто-то захочет искать NULL? Ну и передавать 'NULL'.
Можно и дальше извращаться. Например, передавать в параметре строку со списком значений (обрабатывать LIKEом, например).
Или вообще передавать свои специальные слова. Например, 'ANY' для любого значения. И т.д., как говорится...
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702201
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,

т.к. это динамический sql в итоге и мы передаем строки в запрос, то имее лишние заморочки с sql injections.
поэтому думаю что оптимальный вариант это дополниетльный парметр где указывается режим как именно нужно делать поиск. как выше в примере это можно и без динамического sql сделать с минимальным ущербом для производительности (option recompile).
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702212
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Затуливетерiap,

т.к. это динамический sql в итоге и мы передаем строки в запрос, то имее лишние заморочки с sql injections.
поэтому думаю что оптимальный вариант это дополниетльный парметр где указывается режим как именно нужно делать поиск. как выше в примере это можно и без динамического sql сделать с минимальным ущербом для производительности (option recompile).Где динамический SQL??
Код: sql
1.
2.
3.
4.
5.
6.
7.
DECLARE @Param VARCHAR(100)='38,-56,0,15';

SELECT Value FROM ...
WHERE @Param='ANY'
   OR @Param='NULL' AND Value IS NULL
   OR @Param='NOT NULL' AND Value IS NOT NULL
   OR ','+@Param+',' LIKE '%,'+CAST(Value AS VARCHAR)+',%';

Где тут динамика?
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702224
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap , а что будет, если в @Param передать честный NULL? юзер - он ведь существо творческое...
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702229
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,

а ну если так, то динамики нет.

но есть другие пробелемы/вопросы:
1. что если необходимо искать по совпадению начала строки, like 'asdf%'?
2. как быть с другими типами? конвертить дату и числа в строку?
3. как поддержать другие операции > < != ?

ну и напоследок, а чем собственно плох вариант с доп параметром?
вы ведь тоже самое делаете, только пытаетесь в одном параметре держать и поведение и значение, в чем выигрыш вашего подхода?
...
Рейтинг: 0 / 0
Как параметризовать запрос по условию is null / is not null ?
    #39702246
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решение Владимир Затуливетера мне кажется чище, читабельней. И стандартно проще работать с int параметром, чем проверять строковые параметры, где нужно будет учитывать регистр.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как параметризовать запрос по условию is null / is not null ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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