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

where Value=@Param1 не подходит.
...
Рейтинг: 0 / 0
13.09.2018, 14:13
    #39702109
WaspNewCore
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как параметризовать запрос по условию is null / is not null ?
а, ну и чтобы было достаточно производительным при поиске - читай индексы.
...
Рейтинг: 0 / 0
13.09.2018, 14:33
    #39702131
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как параметризовать запрос по условию is null / is not null ?
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
13.09.2018, 14:45
    #39702143
WaspNewCore
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как параметризовать запрос по условию is null / is not null ?
Вариант с union all что-то совсем не нравится.
Во первых. параметр такой (который нужно проверять на null или реальное значение) может быть не один. А значит, что количество запросов будет степенью двойки от числа этих параметров.....
Во вторых. Кроме этого параметра есть же и другие, принимающие участие. А это значит, что база будет вынуждена прогнать два сложных запроса и потом еще объединить результаты через distinct.

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

Динамический запрос тоже не очень нравится. Хотелось как раз уйти от этого. Динамический запрос то я могу и так построить хоть весь, с рекомпилом. Если придется часть строить динамически, а часть параметрами, то проще наверное уж строить динамически весь (ну имеется ввиду, что все равно используя параметры, но в динамически сгенеренном запросе)
...
Рейтинг: 0 / 0
13.09.2018, 14:48
    #39702150
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как параметризовать запрос по условию is null / is not null ?
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
13.09.2018, 15:17
    #39702169
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как параметризовать запрос по условию is null / is not null ?
WaspNewCoreВо втором случае тоже не очень ясно. У нас имеется 3 ситуации: заполнено, не заполнено, конкретное значение.Чем, с точки зрения значения параметра, отличается "заполнено" от "конкретное значение"?
256kValue = is null исправилСпасибо.
...
Рейтинг: 0 / 0
13.09.2018, 15:18
    #39702172
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как параметризовать запрос по условию is null / is not null ?
WaspNewCoreпараметризуемый запрос, который позволит как искать данные по точному вхождению этих полей, так и по условию null/not null ?

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

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

У меня тоже такой вопрос. Думал о разных вариантов - как например передача еще доп параметра, указывающего как трактовать. Но поэтому и спросил тут.
...
Рейтинг: 0 / 0
13.09.2018, 15:24
    #39702181
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как параметризовать запрос по условию is null / is not null ?
только так думаю
Код: 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
13.09.2018, 15:26
    #39702183
WaspNewCore
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как параметризовать запрос по условию is null / is not null ?
invmWaspNewCoreВо втором случае тоже не очень ясно. У нас имеется 3 ситуации: заполнено, не заполнено, конкретное значение.Чем, с точки зрения значения параметра, отличается "заполнено" от "конкретное значение"?

Ну если мы хотим найти тех юзеров, у которых это поле в принципе заполнено, не важно чем. Либо если ищем тех чье значение нам точно известно и их хотим найти. Это разные ситуации поиска. Найти всех кто хотя бы раз "что-то там, что привело к заполнению поля" и тех, кто "что-то там ровно 3 раза".
...
Рейтинг: 0 / 0
13.09.2018, 15:31
    #39702190
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как параметризовать запрос по условию is null / is not null ?
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
13.09.2018, 15:33
    #39702191
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как параметризовать запрос по условию is null / is not null ?
AkinaWaspNewCoreпараметризуемый запрос, который позволит как искать данные по точному вхождению этих полей, так и по условию null/not null ?

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

т.к. это динамический sql в итоге и мы передаем строки в запрос, то имее лишние заморочки с sql injections.
поэтому думаю что оптимальный вариант это дополниетльный парметр где указывается режим как именно нужно делать поиск. как выше в примере это можно и без динамического sql сделать с минимальным ущербом для производительности (option recompile).
...
Рейтинг: 0 / 0
13.09.2018, 16:14
    #39702212
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как параметризовать запрос по условию is null / is not null ?
Владимир Затуливетер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
13.09.2018, 16:30
    #39702224
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как параметризовать запрос по условию is null / is not null ?
iap , а что будет, если в @Param передать честный NULL? юзер - он ведь существо творческое...
...
Рейтинг: 0 / 0
13.09.2018, 16:38
    #39702229
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как параметризовать запрос по условию is null / is not null ?
iap,

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

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

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


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