использование ifnull с созданием индекса в mysql - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь создать индекс в MySQL, тогда как запрос сначала проверит, какой столбец не равен NULL.После проверки будет создан индекс для столбца, который не является нулевым.Тем не менее, мне не удалось создать это, и он говорит, что у меня есть ошибка, кто-то может мне помочь?пожалуйста, смотрите мой код ниже

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

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

@ lad2025 верно, что MySQL не поддерживает индексы на основе функций (, как PostgreSQL делает ), но в MySQL 5.7 появилась функция для виртуально генерируемых столбцов на основе выражений, а затемВы можете создать индекс для виртуального столбца.

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);
0 голосов
/ 20 мая 2018

MySQL не поддерживает индекс на основе функций.Вы должны создать нормальный индекс:

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

и переписать свой запрос (ИЛИ-Расширение):

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...