You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询如何将精确匹配结果置顶及解决SELECT DISTINCT排序报错

问题原因

你遇到的报错是SQL Server的语法限制:当使用SELECT DISTINCT时,ORDER BY后的排序字段/表达式必须出现在SELECT的返回列表中,你写的CASE判断表达式未放在SELECT列表中,因此触发报错。
另外补充说明:BOLD_ID是你表的行唯一标识,本身不会重复,所以你SQL里的DISTINCT实际是冗余的,直接删除即可解决报错。

可用解决方案

方案1:删除冗余的DISTINCT(推荐)

因为BOLD_ID为行标识,天生唯一,不需要额外去重,直接简化写法即可运行:

SELECT TOP 100 BOLD_ID
FROM Department 
WHERE UPPER(SearchKeysName) LIKE '%\[%32-1%]%' ESCAPE '\'
ORDER BY 
    -- 精确匹配的行优先排序
    CASE WHEN UPPER(SearchKeysName) LIKE '%\[32-1]%' ESCAPE '\' THEN 0 ELSE 1 END ASC,
    -- 同优先级下可按BOLD_ID倒序/正序调整顺序
    BOLD_ID DESC

方案2:保留DISTINCT的写法(适用于有关联查询导致BOLD_ID重复的场景)

用子查询先计算排序优先级,外层再做去重取数,最终只返回需要的BOLD_ID字段:

SELECT DISTINCT TOP 100 BOLD_ID
FROM (
    SELECT 
        BOLD_ID,
        CASE WHEN UPPER(SearchKeysName) LIKE '%\[32-1]%' ESCAPE '\' THEN 0 ELSE 1 END AS sort_order
    FROM Department
    WHERE UPPER(SearchKeysName) LIKE '%\[%32-1%]%' ESCAPE '\'
) AS temp
ORDER BY sort_order ASC, BOLD_ID DESC
额外优化建议

如果你搜索频率很高,可以考虑对SearchKeysName字段做内容预处理,比如提前拆分所有[]包裹的标签单独存为关联表,查询时直接匹配标签字段,比全字段LIKE的效率高很多,也能更灵活的控制匹配优先级。

内容的提问来源于stack exchange,提问作者Roland Bengtsson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:36:03