MSSQL选择OR优先级查询



我需要构建一个MSSQL查询,选择最匹配的一行。

  • 理想情况下,我们有匹配的街道,邮政编码和门牌号。
  • 只有在没有任何结果的情况下,只匹配街道和邮政编码就足够了

我有这个查询到目前为止:

SELECT TOP 1 * FROM realestates
WHERE 
(Address_Street = '[Street]'
AND Address_ZipCode = '1200'
AND Address_Number = '160')
OR  
(Address_Street = '[Street]'
AND Address_ZipCode = '1200')

MSSQL目前给我的结果是Address_Number不是160,所以似乎第二个子句(只有街道和zipcode必须匹配)优先于第一个。如果我切换两个OR子句,结果相同:)

我如何优先考虑第一个OR子句,以便MSSQL停止寻找其他结果,如果我们发现一个匹配的地方,三个字段都存在?

这里的问题不是WHERE(尽管这是一个"问题"),而是缺乏ORDER BY。你有一个TOP (1),但是你没有任何东西告诉数据引擎哪一行是"顶"行;行,返回任意一行。您需要在ORDER BY中提供逻辑来告诉数据引擎哪个是"第一"。行。根据您的问题中的基本逻辑,这应该是:

SELECT TOP (1)
{Explicit Column List}
realestates
WHERE Address_Street = '[Street]'
AND Address_ZipCode = '1200'
ORDER BY CASE Address_Number WHEN '160' THEN 1 ELSE 2 END;

你不能优先考虑WHERE子句中的任何内容。它总是产生所有匹配的行。你能做的是使用TOPFETCH来限制你将看到的结果的数量。

然而,为了使其有效,必须ORDER BY条款。SQL表是无序集合根据定义。这意味着没有ORDER BY子句,数据库可以自由地以它认为方便的任何顺序返回行。大多数情况下,这将是主键的顺序,但也有很多事情可以改变这一点。

相关内容

  • 没有找到相关文章

最新更新