gpt4 book ai didi

sql - 两个值如何相等但又不相等?

转载 作者:行者123 更新时间:2023-12-02 06:26:45 29 4
gpt4 key购买 nike

当我运行以下查询时:

DECLARE 
@val VARCHAR(10) = 'not null'
, @val2 VARCHAR(10) = NULL

-- Test 1.
IF @val <> @val2 SELECT 'Test 1. They are not equal' -- Are they equal?
ELSE SELECT 'Test 1. They are equal'

-- Test 2.
IF @val = @val2 SELECT 'Test 2. They are equal' -- Are they not equal
ELSE SELECT 'Test 2. They are not equal'

我得到以下输出:
Test 1. They are equal
Test 2. They are not equal

请有人可以解释这些结果吗?

最佳答案

与NULL的任何比较都不会是真的。

因此该代码只能返回ELSE值。

关于NULL在SQL中的含义,通常存在一个普遍的误解。

乍一看,人们认为NULL表示“空”。
然后,空不等于空,并且与空没有区别也就很奇怪了。

但是,当NULL被理解为“未知”时,更容易理解。
因为两个未知数不必相同。
而且不能说两个未知数也不相同。
甚至“已知”也可能与“未知”不同,但也可能相同。
逻辑只是不知道...因此NULL

但是眼见为实,所以让我们通过一些例子来说明这一点。
这是一个简单的SQL代码段,以展示比较如何将它们视为NULL。

-- Sample data
DECLARE @Table TABLE
(
Id INT IDENTITY PRIMARY KEY,
Col1 VARCHAR(42),
Col2 VARCHAR(42)
);

INSERT INTO @Table
(Col1, Col2) VALUES
('something', NULL),
(NULL, '>4&×'),
(NULL, NULL),
('same', 'same'),
('same is not', 'different is');

SELECT t.*
, CAST(IIF(col1 = col2, 1, 0) AS BIT) AS IsEqual
, CAST(IIF(col1 <> col2, 1, 0) AS BIT) AS IsNotEqual
, CAST(IIF(col1 = col2 OR (col1 IS NULL AND col2 IS NULL), 1, 0) AS BIT) AS IsNotDistinctFrom
, CAST(IIF(col1 != col2 OR (col1 IS NOT NULL AND col2 IS NULL) OR (col1 IS NULL AND col2 IS NOT NULL), 1, 0) AS BIT) AS IsDistinctFrom
, CAST(IIF(col1 > col2, 1, 0) AS BIT) AS IsGreaterThen
FROM @Table t
ORDER BY Id;

返回:

Id | Col1        | Col2         | IsEqual | IsNotEqual | IsNotDistinctFrom | IsDistinctFrom | IsGreaterThen-: | :---------- | :----------- | :------ | :--------- | :---------------- | :------------- | :------------ 1 | something   | null         | False   | False      | False             | True           | False         2 | null        | >4&×        | False   | False      | False             | True           | False         3 | null        | null         | False   | False      | True              | False          | False         4 | same        | same         | True    | False      | True              | False          | False         5 | same is not | different is | False   | True       | False             | True           | True         


Jup,NULL将为NULL。

对db <> fiddle here的测试

关于 IsNotDistinctFromIsDistinctFrom列?
我仅包括它们,因为在标准SQL中也存在 NULL-aware比较。
有关该 here的更多详细信息

关于sql - 两个值如何相等但又不相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59158139/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com