传值 @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 很牛
#7
不用if,肯定要2个都查了,效率反而低
怕代码繁琐,可以写成通用的存储过程 sameorlike(表名,字段名,待查内容)。。。。
怕代码繁琐,可以写成通用的存储过程 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 很牛
#7
不用if,肯定要2个都查了,效率反而低
怕代码繁琐,可以写成通用的存储过程 sameorlike(表名,字段名,待查内容)。。。。
怕代码繁琐,可以写成通用的存储过程 sameorlike(表名,字段名,待查内容)。。。。
#8
一条语句是为了什么目的?
难道是为了性能更差?.
逻辑是怎么样,就怎么处理就是了.不要求一条语句
难道是为了性能更差?.
逻辑是怎么样,就怎么处理就是了.不要求一条语句
#9
select * from user where name like '%'+@name+'%' order by case when name =@name then 1 else 2 end,name
结果都在里面,只是你要的顺序不同
结果都在里面,只是你要的顺序不同