首页 > 解决方案 > SQL中的排名匹配

问题描述

我有一个 SQL 存储过程,它将姓名和电话作为输入参数,并将 ID 作为输出参数返回。如果找到名称匹配,我想返回 ID,但如果没有在电话上匹配。如果我使用 OR 语句,它会返回两个 ID,但我只需要返回一个 ID。

ID      Name        Phone
---------------------------
1       Dag         5070000000
2       Adam        2020000000
3       John        3010000000


@name ='Dag' 
@phone ='3010000000'
Select ID From Tbl Where Name=@name OR Phone=@phone

在这种情况下,它返回 1 和 3 的 ID,但我希望它只返回 ID 1,因为对我来说,名称匹配比电话匹配更重要。请帮忙。

标签: sql

解决方案


如果您期待一行,您可以执行以下操作:

select ID
from Tbl
where Name = @name OR Phone = @phone
order by (case when name = @name and phone = @phone then 1 
               when name = @name then 2
               else 3
          end)
fetch first 1 row only;

注意:并非所有数据库都认可 ISO/ANSI 标准fetch first 1 row only。有些拼写limit。一些select top (1).


推荐阅读