假设您有一个如下所示的查询:
SELECT * FROM client
WHERE identifyingnumber LIKE '%86%'
有时可能存在完全匹配,这意味着识别号码为86.使用与查询顶部完全匹配的记录的最佳方法是什么?
答案 0 :(得分:7)
考虑到完全匹配必须是所有匹配的字符串长度最短。
SELECT *
FROM client
WHERE identifyingnumber LIKE '%86%'
ORDER BY LEN(identifyingnumber)
由于LEN操作,这将是一个CPU高的查询。您可以考虑在客户端表中创建一个用于识别号码长度的列 - 可能作为计算列 - 以便在选择中保存一些CPU。
至于什么是最好的 - 这取决于你的系统。 Paolo提供的UNION选项也是我想到的第一件事,除了需要处理两个不同的参数值,假设你参数化你的查询(就像我一直这样)。
答案 1 :(得分:4)
也许不是最优雅的方式,但它应该有效:
SELECT *
FROM
(
SELECT *, 1 AS PRIO FROM client
WHERE identifyingnumber = '86'
UNION
SELECT *, 2 AS PRIO FROM client
WHERE identifyingnumber LIKE '%86%'
AND identifyingnumber <>'86'
) AS X
ORDER BY PRIO
答案 2 :(得分:4)
一种方式:
SELECT *,
CASE
WHEN identifyingnumber = '86' THEN 1
WHEN identifyingnumber LIKE '86%' THEN 2
ELSE 3
END AS Rank
FROM client
WHERE identifyingnumber LIKE '%86%'
ORDER BY Rank
e.g。这给出了几个级别的排名
或者...
SELECT *
FROM client
WHERE identifyingnumber LIKE '%86%'
ORDER BY
CASE WHEN identifyingnumber = '86' THEN 1
WHEN identifyingnumber LIKE '86%' THEN 2 ELSE 3 END