Улучшение сравнения выражений с ПОМОЩЬЮ IS [NOT] DISTINCT FROM
- 7 мин
SQL Server 2022 улучшает язык запросов с помощью нового предиката, IS [NOT] DISTINCT FROM
предназначенного для упрощения операций сравнения с значениями NULL
.
IS [NOT] DISTINCT FROM Предикат
Предикат IS [NOT] DISTINCT FROM
— удобный способ сравнения двух выражений, обеспечивая истинный или ложный результат даже при NULL
наличии значений. Он используется в условии WHERE
поиска и HAVING
предложениях, условиях соединения FROM
предложений и других конструкциях, где требуется логическое значение.
Работа со значениями NULL
в SQL Server может быть сложной задачей, так как сравнение их приводит к неизвестному результату. Предикат IS DISTINCT FROM / IS NOT DISTINCT FROM
упрощает это сравнение, рассматривая NULLs
известные значения в сравнениях. Ознакомьтесь со следующей таблицей со значениями A и B , чтобы продемонстрировать разницу между IS NOT DISTINCT FROM
сравнениями равенства:
Объект | B | A = B |
AIS NOT DISTINCT FROM B |
---|---|---|---|
0 | 0 | Истина | Истина |
0 | 1 | Неправда | Неправда |
0 | Отсутствует | Неизвестно | Неправда |
Отсутствует | Отсутствует | Неизвестно | Истина |
Выполнение поиска с предикатом IS DISTINCT FROM, даже если значение может иметь значение NULL
Представьте, что вы разработчик базы данных, работающий над новым приложением электронной коммерции. У вас есть таблица Sales.SalesOrderDetail, содержащая столбцы SalesOrderID, ProductID, ProductSubcategoryID, OrderQty, UnitPrice, UnitPriceDiscount и LineTotal. Вы хотите найти все строки в таблице Sales.SalesOrderDetail , где:
- UnitPriceDiscount отличается от нуля, или другими словами, что он имеет скидку.
- Подкатегория — Road Bikes.
- Дата заказа была 31 июля 2013 года.
- Велосипед был желтым цветом.
- Общая сумма строки превышает 15 000.
Кроме того, используя предыдущее определение, вы также хотите найти все строки, где скидка составляет 10 процентов. Не все заказы имеют скидку, поэтому поле скидки может быть NULL
.
IS [NOT] DISTINCT FROM
С помощью предиката можно быстро и легко записывать запросы для достижения этих целей. Выполните следующие запросы в SQL Server Management Studio (SSMS), чтобы найти нужные данные:
-- Query to return rows where the Discount is DISTINCT FROM 0.00
SELECT SOD.SalesOrderID
, P.Name
,SOD.OrderQty
,SOD.UnitPrice
,SOD.UnitPriceDiscount
,SOD.LineTotal
FROM AdventureWorks2012.Sales.SalesOrderDetail SOD
JOIN AdventureWorks2012.Sales.SalesOrderHeader SOH ON SOD.SalesOrderID = SOH.SalesOrderID
JOIN AdventureWorks2012.Production.Product P ON P.ProductID = SOD.ProductID
JOIN AdventureWorks2012.Production.ProductSubcategory PSC ON P.ProductSubcategoryID = PSC.ProductSubcategoryID
WHERE Color = 'Yellow'
AND UnitPriceDiscount IS DISTINCT FROM 0.00
AND PSC.Name = 'Road Bikes'
AND SOH.OrderDate = '2013-07-31 00:00:00.000'
AND LineTotal > 15000
ORDER BY SalesOrderID
Результаты.
ID заказа на продажу | Имя. | КоличествоЗаказа | Цена за единицу | Скидка на единичную цену | ИтогСтроки |
---|---|---|---|---|---|
53460 | Road-350-W, желтый, 48 | 30 | 850.495 | 0.10 | 22963.365000 |
53530 | Road-350-W, желтый, 48 | 17 | 935.5445 | 0.05 | 15109.043675 |
-- Query to return rows where the Discount is NOT DISTINCT FROM 0.10
SELECT SOD.SalesOrderID
, P.Name
,SOD.OrderQty
,SOD.UnitPrice
,SOD.UnitPriceDiscount
,SOD.LineTotal
FROM AdventureWorks2012.Sales.SalesOrderDetail SOD
JOIN AdventureWorks2012.Sales.SalesOrderHeader SOH ON SOD.SalesOrderID = SOH.SalesOrderID
JOIN AdventureWorks2022.Production.Product P ON P.ProductID = SOD.ProductID
JOIN AdventureWorks2012.Production.ProductSubcategory PSC ON P.ProductSubcategoryID = PSC.ProductSubcategoryID
WHERE Color = 'Yellow'
AND UnitPriceDiscount IS NOT DISTINCT FROM 0.10
AND PSC.Name = 'Road Bikes'
AND SOH.OrderDate = '2013-07-31 00:00:00.000'
AND LineTotal > 15000
ORDER BY SalesOrderID
Результаты.
ID заказа на продажу | Имя. | КоличествоЗаказа | Цена за единицу | СкидкаНаЦенаЕдиницы | ИтогСтроки |
---|---|---|---|---|---|
53460 | Road-350-W, желтый, 48 | 30 | 850.495 | 0.10 | 22963.365000 |
Эти запросы возвращают строки, в которых столбец UnitPriceDiscount совпадает или не соответствует указанному значению, даже если NULL
значения присутствуют.
Предикат IS [NOT] DISTINCT FROM
в SQL Server 2022 упрощает обработку NULL
значений в сравнениях. Рассматривая NULL
как известные значения. Этот предикат упрощает и упрощает работу кода. Эта функция является ценным дополнением для разработчиков и администраторов баз данных, работающих с SQL Server.