检查多个列中一个大于或等于 (>=) 的值



假设我有一个这样的表:

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,但由于不知道如何使用>=

假设所有值都不是NULL,则可以使用greatest():

SELECT *
FROM table
WHERE GREATEST(col1, col2, col3, col5) >= 10;

这效率不高,但更短。

这就是我编写脚本的方式。您可以尝试以下方法,但性能可能会降低(不确定,因为没有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;

最新更新