我需要找到一个select语句,它将返回一个与我的输入完全匹配的记录,或者如果找不到完全匹配则返回最接近的匹配.
到目前为止,这是我的选择声明.
SELECT * FROM [myTable]
WHERE Name = 'Test' AND Size = 2 AND PType = 'p'
ORDER BY Area DESC
Run Code Online (Sandbox Code Playgroud)
我需要做的是找到与'Area'字段最接近的匹配,所以如果我的输入是1.125并且数据库包含2,1.5,1和.5,则查询将返回包含1的记录.
我的SQL技能非常有限,所以任何帮助都会受到赞赏.
Mik*_*keW 66
获取区域和输入之间的差异,取绝对值,使其始终为正,然后按顺序递增并取第一个
SELECT TOP 1 * FROM [myTable]
WHERE Name = 'Test' and Size = 2 and PType = 'p'
ORDER BY ABS( Area - @input )
Run Code Online (Sandbox Code Playgroud)
Rya*_*ham 10
一些可怕的东西,沿着:
ORDER BY ABS( Area - 1.125 ) ASC LIMIT 1
Run Code Online (Sandbox Code Playgroud)
也许?
Name如果您有许多行满足、Size和列上的等式谓词PType,那么您可能需要Area在查询中的列上包含范围谓词。如果该Area列被索引,则可以允许高效的基于索引的访问。
以下查询(使用 Oracle 语法编写)使用 a 的一个分支UNION ALL来查找具有最小目标的记录,而另一个分支查找具有最大目标的Area >=记录。Area <这两条记录之一将是您要查找的记录。然后您可以ORDER BY ABS(Area - ?input)从这两个候选人中选出获胜者。不幸的是,由于需要嵌套 SELECT 来强制执行所需的 ROWNUM / ORDER BY 优先级,因此查询很复杂。
SELECT *
FROM
(SELECT * FROM
(SELECT * FROM
(SELECT * FROM [myTable]
WHERE Name = 'Test' AND Size = 2 AND PType = 'p' AND Area >= ?target
ORDER BY Area)
WHERE ROWNUM < 2
UNION ALL
SELECT * FROM
(SELECT * FROM [myTable]
WHERE Name = 'Test' AND Size = 2 AND PType = 'p' AND Area < ?target
ORDER BY Area DESC)
WHERE ROWNUM < 2)
ORDER BY ABS(Area - ?target))
WHERE rownum < 2
Run Code Online (Sandbox Code Playgroud)
此查询的一个好的索引是(Name, Size, PType, Area),在这种情况下,预期的查询执行计划将基于两个索引范围扫描,每个扫描返回一行。
| 归档时间: |
|
| 查看次数: |
68245 次 |
| 最近记录: |