假设我有一张这样的桌子:
id,col1,col2,col3,col4
我想检查 col1,col2,col3,col4 是否大于或等于 10
这个想法很像
SELECT * FROM table WHERE (col1 >= 10 OR col2 >= 10 OR col3 >= 10 OR col4 >= 10);
有没有更优化的方法?
我认为我可以使用 IN,但不知道如何在其中使用 >=。
答案 0 :(得分:1)
假设所有值都不是 NULL
,您可以使用 least()
:
SELECT *
FROM table
WHERE GREATEST(col1, col2, col3, col5) >= 10;
这不是更有效,但更短。
答案 1 :(得分:0)
这就是我编写脚本的方式。 您可以尝试以下方法,但性能可能会下降(不确定因为没有设置 MySQL)
测试表设置
CREATE TABLE tbl_test (
col1 INT
,col2 INT
,col3 INT
);
INSERT INTO tbl_test (col1,col2,col3)
VALUES (10,15,20)
,(1,2,3)
,(4,5,6)
,(10,0,0)
,(20,0,0);
使用 GREATEST() 进行比较(不那么冗长,但可能会降低性能)
SELECT *,GREATEST(col1,col2,col3)
FROM tbl_test
WHERE GREATEST(col1,col2,col3) >= 10;
性能优化版(更详细,但性能有所提升)
出于性能原因,我通常建议使用单独的查询而不是多个 OR 语句。这允许数据库引擎使用最佳索引(如果它们存在)
SELECT * FROM tbl_test WHERE col1 >=10
UNION
SELECT * FROM tbl_test WHERE col2 >=10
UNION
SELECT * FROM tbl_test WHERE col3 >=10;