在 mysql 中使用 ifnull 和索引创建

using ifnull with index creation in mysql

我正在尝试在 MySQL 中创建索引,而查询将首先检查哪一列不为空。检查后,它将在非空列上创建索引。但是,我没有成功创建它,它说我有错误,有人可以帮助我吗?请在下面查看我的代码

create index IDX_KSE_NO_01 on tb_kse(ifnull(ss_no, id_no);

MySQL 不支持基于函数的索引。您应该创建普通索引:

create index IDX_KSE_NO_01 on tb_kse(ss_no);
create index IDX_KSE_NO_02 on tb_kse(id_no);

并重写您的查询(OR-Expansion):

SELECT *
FROM tb_kse WHERE ss_no = ?
UNION 
SELECT *
FROM tb_kse
WHERE ss_no IS NULL AND id_no = ?;

DBFiddle Demo


另一种方法是创建生成列并在其上创建索引:

CREATE TABLE tb_kse(id_no INT, ss_no INT,
       gen_col INT GENERATED ALWAYS AS (ifnull(ss_no, id_no)) STORED);

create index IDX_KSE_NO_01 on tb_kse(gen_col);

SELECT *
FROM tb_kse
WHERE gen_col = ?;

DBFiddle Demo 2

@lad2025 是正确的 MySQL 不支持基于函数的索引(like PostgreSQL does), but MySQL 5.7 introduced a feature for virtual generated columns 基于表达式,然后你可以在虚拟列上创建索引。

ALTER TABLE tb_kse ADD COLUMN either_no VARCHAR(10) AS (IFNULL(ss_no, id_no));
CREATE INDEX IDX_KSE_NO_01 ON tb_kse(either_no);