SQLite - это утверждение CASE дорого?

Мне интересно, не рекомендуется ли использовать оператор CASE в SQLite (или других SQL-машинах) для замены данных. Например, скажем, у меня есть запрос.

SELECT Users, 
                CASE WHEN Active = 0 THEN 'Inactive'
                        WHEN Active = 1 THEN 'Active'
                        WHEN Active = 2 THEN 'Processing'
                        ELSE 'ERROR' END AS Active
FROM UsersTable;

Когда лучше создать справочную таблицу и выполнить JOIN. В этом случае я бы создал таблицу ActiveStatesTable с ActiveID, ActiveDescription и выполнил JOIN.

Ответ 1

Оператор CASE является предпочтительным синтаксисом:

  • Это ANSI (92?), поэтому он поддерживается в MySQL, Oracle, SQL Server, Postgres... в отличие от синтаксиса IF конкретного поставщика базы данных.
  • Он поддерживает короткое цирирование - остальная часть оценки не выполняется после соответствия критериям

Ответ 2

Выполнение отдельной таблицы и JOIN - это, безусловно, более чистый способ написать этот код. Что происходит, например, если вы хотите написать другой запрос с теми же сопоставлениями? Вам нужно будет скопировать оператор CASE в новый запрос, а копирование дубликатов - плохо. Что произойдет, если вам нужно добавить новое активное состояние?

По производительности, как JOIN, так и CASE должны быть довольно дешевыми. CASE может быть немного более результативным из-за короткого замыкания оценки и нескольких случаев, но JOIN - это, на мой взгляд, более чистое и гибкое решение SQL-ey.

Ответ 3

CASE должен быть намного дешевле, поскольку он не должен включать какие-либо операции ввода-вывода, но для небольших таблиц JOINs тоже не так дорого (но проверьте его).

Вопрос в том, нужно ли поддерживать этот CASE в нескольких запросах, и вам нужно будет установить на нем любую ссылочную целостность.