请教一条sql语句的问题,如何先精确匹配在模糊匹配。

时间:2021-12-01 06:04:22
如题有一张user表。里面有个name字段

传值 @name

希望
select * from user where name=@name如果有值 就显示出来

如果没值 就进行模糊匹配 显示出

select * from user where name like '%'+@name+'%';


的效果

可不可以直接一条sql搞定 不通过if判断 

9 个解决方案

#1


with table1 as
(
select 'a' [name] union all
select 'bac' [name] union all
select 'b' [name]
)
select * from table1 
where [name] like case when (select COUNT(*) from table1 where [name]='a') >0 then 'a' else '%a%' end

#2


1楼的当然可以, 但效率不高, 数据量大时会有瓶颈(相当于查了两次)。 建议你写IF来查。

#3


不用if 就用case when then 呗~~

#4


楼主想一条语句完成,肯定需要带子查询了,1楼符合楼主要求

#5


-- 参数
DECLARE @name varchar(20)
SET @name = 'x'

-- 一条sql搞定
;WITH
/* 测试数据
[user](id,[name]) as
(
    SELECT 1,'x' UNION ALL
    SELECT 2,'y' UNION ALL
    SELECT 3,'xyz' UNION ALL
    SELECT 4,'zyx'
),*/
a AS (
    select *,1 grp from [user] where name=@name
    UNION ALL
    select *,2 grp from [user] where name like '%'+@name+'%'
),
b AS (
    SELECT *,
           RANK() OVER(ORDER BY grp) rank
      FROM a
)

SELECT id,[name]
  FROM b
 WHERE rank = 1

@name = 'x' 的结果
         id name
----------- ----
          1 x

@name = 'z' 的结果
         id name
----------- ----
          3 xyz
          4 zyx

#6


Tiger_Zhao 很牛 请教一条sql语句的问题,如何先精确匹配在模糊匹配。

#7


不用if,肯定要2个都查了,效率反而低

怕代码繁琐,可以写成通用的存储过程 sameorlike(表名,字段名,待查内容)。。。。

#8


一条语句是为了什么目的?
难道是为了性能更差?.
逻辑是怎么样,就怎么处理就是了.不要求一条语句

#9


select * from user where name like '%'+@name+'%'  order by case when name =@name then 1 else 2 end,name

结果都在里面,只是你要的顺序不同

#1


with table1 as
(
select 'a' [name] union all
select 'bac' [name] union all
select 'b' [name]
)
select * from table1 
where [name] like case when (select COUNT(*) from table1 where [name]='a') >0 then 'a' else '%a%' end

#2


1楼的当然可以, 但效率不高, 数据量大时会有瓶颈(相当于查了两次)。 建议你写IF来查。

#3


不用if 就用case when then 呗~~

#4


楼主想一条语句完成,肯定需要带子查询了,1楼符合楼主要求

#5


-- 参数
DECLARE @name varchar(20)
SET @name = 'x'

-- 一条sql搞定
;WITH
/* 测试数据
[user](id,[name]) as
(
    SELECT 1,'x' UNION ALL
    SELECT 2,'y' UNION ALL
    SELECT 3,'xyz' UNION ALL
    SELECT 4,'zyx'
),*/
a AS (
    select *,1 grp from [user] where name=@name
    UNION ALL
    select *,2 grp from [user] where name like '%'+@name+'%'
),
b AS (
    SELECT *,
           RANK() OVER(ORDER BY grp) rank
      FROM a
)

SELECT id,[name]
  FROM b
 WHERE rank = 1

@name = 'x' 的结果
         id name
----------- ----
          1 x

@name = 'z' 的结果
         id name
----------- ----
          3 xyz
          4 zyx

#6


Tiger_Zhao 很牛 请教一条sql语句的问题,如何先精确匹配在模糊匹配。

#7


不用if,肯定要2个都查了,效率反而低

怕代码繁琐,可以写成通用的存储过程 sameorlike(表名,字段名,待查内容)。。。。

#8


一条语句是为了什么目的?
难道是为了性能更差?.
逻辑是怎么样,就怎么处理就是了.不要求一条语句

#9


select * from user where name like '%'+@name+'%'  order by case when name =@name then 1 else 2 end,name

结果都在里面,只是你要的顺序不同