提问人:Olmo 提问时间:4/22/2011 最后编辑:Olmo 更新时间:4/22/2011 访问量:623
将 SQL Server 中的元组与三元布尔逻辑进行比较
comparing tuples in SQL Server with ternary boolean logic
问:
我有一个关于三元布尔逻辑的问题,它会影响如何在 LINQ 提供程序中实现多态实体之间的比较。
在 SQL 中,如果使用外键将 Region 表联接到 Country :
SELECT * From Region r1, Region r2
WHERE r1.Country == r2.Country
(注意:无论您使用 JOIN 还是 WHERE synthax,结果都是相同的)
它将返回条件为 true 的值,而不是条件为 false 或未知的值(因为某些键为 null)。因此,如果我们否定这个条件:
SELECT * From Region r1, Region r2
WHERE r1.Country != r2.Country
我们得到条件为 true 的值(现在是不同的键),我们将跳过具有相同键的值,或者具有一些 null 值的值,因为条件再次返回 unknown。即使我们这样写:
SELECT * From Region r1, Region r2
WHERE not(r1.Country == r2.Country)
未知数将被传播,因此对于这个简单条件,空值永远不会出现。目前为止,一切都好。
现在让我们想象一下,一个地区可以有一个国家(对于欧洲小国)或一个州(对于美国、俄罗斯、中国......如果该区域有一个州,它将具有 Country null,反之亦然。
我们如何连接对 [Country,State],使其具有与以前相同的属性?
SELECT * From Region r1, Region r2
WHERE r1.Country == r2.Country OR r1.State == r2.State
如果此表达式连接,则返回 true,否则返回 unknown。我们希望它仅在所有字段都为 null 的情况下返回 unknown,否则如果我们否定:
SELECT * From Region r1, Region r2
WHERE not(r1.Country == r2.Country OR r1.State == r2.State)
它不返回任何行!。如果我们尝试一个更复杂的表达式:
SELECT * From Region r1, Region r2
WHERE (r1.Country == r2.Country AND r1.Country IS NOT NULL AND r2.Country IS NOT NULL)
OR (r1.State == r2.State AND r1.State IS NOT NULL AND r2.State IS NOT NULL)
然后,当货币对匹配时,它将返回 true,否则返回 false,并且永远不会 nothing。然后,如果我们否定,它将返回所有行都为 null 的值,其行为与 firs 示例中的行为不同。
那么比较这一对的表达式会表现得像 SQL 相等吗?
- 匹配时为 True
- 不匹配时为 False
- 当某个操作数为 null 时未知。
答:
创建计算列:
Location AS COALESCE(Country, State)
,索引它并像往常一样进行比较:
SELECT *
FROM Region r1
JOIN Region r2
ON r2.Location = r1.Location
Location
如果两者都是 和 是 .NULL
Country
State
NULL
更新:
如果 和 可以相互比较,请创建一个附加列,显示使用的列:Country
State
LocationType AS CASE WHEN Country IS NOT NULL THEN 1 WHEN State IS NOT NULL THEN 2 END,
LocationId AS COALESCE(Country, State)
,索引两者并进行比较:
SELECT *
FROM Region r1
JOIN Region r2
ON r2.LocationType = r1.LocationType
AND r2.LocationID = r1.LocationID
评论
ON CASE WHEN r1.… END = CASE WHEN r2.… END AND COALESCE(r1.…) = COALESCE(r2.…)
OR
你能试试这个吗?
SELECT *
FROM Region r1
JOIN Region r2
ON ( r1.Country = r2.Country
AND r1.State IS NULL
AND r2.State IS NULL
)
OR ( r1.State = r2.State
AND r1.Country IS NULL
AND r2.Country IS NULL
)
评论
Country
State
LocationType
上一个:求布尔表达式的简化乘积和。
评论