如果行为零,如何在条件运行的情况下运行

时间:2017-10-16 18:52:25

标签: mysql

假设我有一张桌子

表格

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| +-------------+

fiddle

提前致谢

3 个答案:

答案 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%')

我想首先将计数值计算到变量中是一个好主意,但是,优化器无论如何都可以识别独立的子查询并运行一次。