概述
请教一条sql语句的问题,如何先精确匹配在模糊匹配。
如题有一张user表。里面有个name字段
传值 @name
希望
select * from user where name=@name如果有值 就显示出来
如果没值 就进行模糊匹配 显示出
select * from user where name like '%'+@name+'%';
的效果
可不可以直接一条sql搞定 不通过if判断
------解决思路----------------------
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
------解决思路----------------------
1楼的当然可以, 但效率不高, 数据量大时会有瓶颈(相当于查了两次)。 建议你写IF来查。
------解决思路----------------------
不用if 就用case when then 呗~~
------解决思路----------------------
楼主想一条语句完成,肯定需要带子查询了,1楼符合楼主要求
------解决思路----------------------
-- 参数
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
------解决思路----------------------
Tiger_Zhao 很牛
------解决思路----------------------
不用if,肯定要2个都查了,效率反而低
怕代码繁琐,可以写成通用的存储过程 sameorlike(表名,字段名,待查内容)。。。。
------解决思路----------------------
一条语句是为了什么目的?
难道是为了性能更差?.
逻辑是怎么样,就怎么处理就是了.不要求一条语句
------解决思路----------------------
select * from user where name like '%'+@name+'%' order by case when name =@name then 1 else 2 end,name
结果都在里面,只是你要的顺序不同
最后
以上就是无聊豌豆为你收集整理的oracle 先精确再模糊查找,请问一条sql语句的有关问题,怎么先精确匹配在模糊匹配...的全部内容,希望文章能够帮你解决oracle 先精确再模糊查找,请问一条sql语句的有关问题,怎么先精确匹配在模糊匹配...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复