可以在以后的情况下使用WHERE吗?

时间:2019-11-13 14:27:59

标签: mysql sql

当我在CASE语句中的THEN之后使用WHERE时,它会给出类似语法错误的错误,因此如何在CASE THEN中添加条件 示例:

SELECT CASE when sum(price)>5000 THEN price WHERE name LIKE %%

OR

SELECT case when sum(price)>5000 THEN price = SELECT price from products where name LIke %%

但是它会发出语法错误

2 个答案:

答案 0 :(得分:2)

这里不允许使用。

尝试一下:

SELECT 
      CASE when sum(price) > 5000 
         THEN price 
         ELSE 'somethingElse' END 
   FROM 
      tableName 
   WHERE 
      name LIKE %%

SELECT 
      CASE when sum(price) > 5000 AND name LIKE %% 
           THEN price ELSE ... END

答案 1 :(得分:0)

此答案并非旨在解决此XY问题。
只需将其视为MySql语法实验即可。

允许在CASE语句中使用子查询。
但是该子查询必须仅返回1个结果值或不返回任何结果。

例如,以下测试代码段:

drop table if exists test;
create table test (name varchar(30), price int);
insert into test (name, price) values
  ('prod1', 1001)
, ('prod1', 1001)
, ('prod2', 2001), ('prod2', 2001), ('prod2', 2001)
, ('prod9999', 9999)
;

SELECT
 name,
 sum(price) as price,
 (CASE 
 WHEN sum(price)>5000 
 THEN (select sum(price) from test where name like '%prod999%')
 ELSE sum(price)
 END) as price2
from test
group by name;

返回:

name     price  price2
prod1    2002  2002
prod2    6003  9999
prod9999 9999  9999

但是,不应使用这种方法。
该子查询将运行多次。
而且没有充分的理由,因为每次返回的值都是相同的。

在这种情况下,可以连接子查询。

SELECT
 p.name,
 sum(p.price) as price,
 (CASE 
 WHEN sum(p.price)>5000
 THEN sum(prod999.price)
 ELSE sum(p.price)
 END) as price2
from test p
cross join (select sum(price) as price from test where name like '%prod999%') as prod999
group by p.name
order by p.name;