假设我有一张桌子
表格
while(cases--){
for(int i=0;i<MAX;i++)
{
dp[i]=-1; //Dp table Initiailization
}
cin>>dp[0]>>dp[1]>>dp[2]>>dp[3]>>dp[4]>>dp[5]>>n;
cout<<"Case "<<++caseno<<": "<<fn(n)%10000007<<endl;
}
首先我必须得到数据,如果匹配首先是一些像:
如果+-------------+
| id | name |
+-------------+
| 1 | xabx |
| 2 | abxd |
| 3 | axcd |
| 4 | azyx |
| 5 | atyl |
| 6 | aksd |
| 7 | baabc|
| 8 | aabcd|
+-------------+
然后必须运行name = aab
select * from table where name like 'aab%'
我想要的
但如果我只有+-------------+
| 8 | aabcd |
+-------------+
然后上面的查询返回abc
行
然后我必须从中间搜索:
0
然后返回哪个是替代
select * from table where name like '%abc%'
我对mysql知之甚少是否有任何查询可以做如果首先条件没有行然后运行替代条件
我试过这个,但没有按我的意愿工作。
+-------------+
| 7 | baabc|
| 8 | aabcd|
+-------------+
提前致谢
答案 0 :(得分:1)
这有点是你想要的结果:
select *from t
where (case
when name like 'abc' then 1
when name like 'bc%' then 1
when name like '%bc' then 1
when name like '%bc%' then 1
else null
end)
order by name
limit 1;
我只是将所有组合作为条件。
您可以互换序列或删除不必要的条件。
无论条件满足哪个,limit 1
只能显示1行。
这是你小提琴的答案。 Check it out
希望它有所帮助!
答案 1 :(得分:0)
这是一个可能的解决方案:
左边加入表格本身,表格最初被更具包容性的%bx%
过滤,然后加入过度限制性更强bx%
。
这允许您使用连接名称(如果存在),但如果不存在,则还原为原始名称:
SELECT t1.id, IF(t2.name IS NULL, t1.name, t2.name) name
FROM test t1
LEFT JOIN test t2 ON t2.id = t1.id AND t1.name like 'bx%'
WHERE t1.name LIKE '%bx%'
根据尺寸或数据集,这可能/可能不理想。
答案 2 :(得分:0)
COUNT
检查可能有效
select *
from table
where name like 'aab%' or
((select count(*) from table where name like 'aab%') = 0 and name like '%abc%')
我想首先将计数值计算到变量中是一个好主意,但是,优化器无论如何都可以识别独立的子查询并运行一次。