Обработка NULL значений
Цель:
Реализовать многотабличный запрос с возможностью фильтрации и поиска через параметры
Исключить сортировку по пустым столбцам
Суть проблемы
Microsoft SQL Server 2014 (SP2-GDR) (KB4505217) - 12.0.5223.6 (X64) May 26 2019 20:36:50 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.3 (Build 9600: ) (Hypervisor)
Вот запрос
Я извинюсь за названия полей и таблиц, это не моих рук дело
SELECT
ISNULL(t.NomerKarty,'-') AS NomerKarty,
o.Name,
f.Id,
f.FIO,
ti.DataVydachiKarty,
ti. DataIzjyatiyaKarty,
ISNULL(ti.StatusKarty,'-') AS StatusKarty,
ISNULL (ti.LimitKartyLMes,'-') AS LimitKartyLMes
--Подключение основных таблиц
FROM ZayavkaNaVydachuToplivnoyKar AS z
LEFT JOIN ToplivnayaKarta AS t ON z.ToplivnayaKarta = t.id
LEFT JOIN ToplivnayaKarta_InformaciyaO AS ti ON t.id = ti.id
--Подключение справочников
INNER JOIN [FizicheskieLica] AS f ON f.Id = z.FIOSotrudnika
INNER JOIN [MyLegalPerson] AS o ON o.Id = z.Organizaciya
--Условия отбора
WHERE ti.DataVydachiKarty >= @DataVydachi
ti.DataVydachiKarty BETWEEN (SELECT ISNULL(@DataVydachi, min(ti.DataVydachiKarty))
FROM ToplivnayaKarta_InformaciyaO ti
GROUP BY ti.DataVydachiKarty)
AND
(SELECT ISNULL(@DataVydachi, max(ti.DataVydachiKarty))
FROM ToplivnayaKarta_InformaciyaO ti
GROUP BY ti.DataVydachiKarty)
AND
ti.DataIzjyatiyaKarty BETWEEN (SELECT ISNULL(@DataIzjyatiya, min(ti.DataIzjyatiyaKarty))
FROM ToplivnayaKarta_InformaciyaO ti
GROUP BY ti.DataIzjyatiyaKarty)
AND
(SELECT ISNULL(@DataIzjyatiya, max(ti.DataIzjyatiyaKarty))
FROM ToplivnayaKarta_InformaciyaO ti
GROUP BY ti.DataIzjyatiyaKarty)
{IF {$Organizaciya} <> null }
AND o.Id = @Organizaciya
{END IF}
{IF {$FIO} <> null }
AND f.Id = @FIO
{END IF}
{IF {$NomerKarty} <> null }
AND t.id = @NomerKarty
{END IF}
{IF {$Status} <> null }
AND ti.StatusKarty = @Status
{END IF}
Суть проблемы в том, что на данный момент большинство записей в таблице имеют NULL значение в том числе и ti.DataVydachiKarty ti. DataIzjyatiyaKarty
Проблема возникает в блоке WHERE, а конкретно в конструкциях BETWEEN AND, когда через них проходят абсолютно пустые значения столбцов запрос функционирует неправильно выдавая пустою таблицу
Что я пробовал
- В под запросе, в конструкции
BETWEEN ANDвы можете наблюдать функциюmin(ti.DataVydachiKarty)илиmax(ti.DataVydachiKarty), аналогично для других под запросов, не помогло ведь дат то нет - Заместо конструкций
min(ti.DataVydachiKarty)илиmax(ti.DataVydachiKarty)указывал минимальную и максимальную дату, который позволяет тип данных т.е.0001-01-01и9999-12-31 - В блоке
WHEREдополнительно указывал условие:
WHERE
ti.DataVydachiKarty IS NOT NULL AND ti.DataIzjyatiyaKarty IS NOT NULL AND
ti.DataVydachiKarty BETWEEN ... AND ... AND
ti.DataIzjyatiyaKarty BETWEEN ... AND ...
К сожалению это тоже не помогло
- Эксперименты в блоке
SELECT, я использовалISNULL(ti.DataVydachiKarty, CONVERT(DATE, GETDATE()))аналогично дляti.DataIzjyatiyaKarty
Но это не корректновведите сюда код - Некоторые другие незначительные правки, результат которых я уже не помню
upd: Объедение таблиц LEFT JOIN будет заменено на INNER JOIN, так как пустых значений быть не может, следовательно и этой проблемы тоже, но на данный момент она есть