在内部部分匹配T-SQL查询的顶部进行精确匹配显示

时间:2012-03-08 22:49:53

标签: sql sql-server-2008 tsql match

假设您有一个如下所示的查询:

SELECT * FROM client
WHERE identifyingnumber LIKE '%86%'

有时可能存在完全匹配,这意味着识别号码为86.使用与查询顶部完全匹配的记录的最佳方法是什么?

3 个答案:

答案 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