2010-04-01 2 views
10

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

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.

ответ

11

Предпочтительно заявление СЛУЧАЯ Синтаксис:

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

Следует учитывать размер выражения CASE? Что, если столбец «Идентификатор описания» был в таблице, и есть 100 описаний для сопоставления? – galford13x

3

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

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

+0

Это правда, но сохранение CASE не будет слишком сложным, поскольку я мог бы просто создать VIEW с тем, что имеет CASE, а затем сохранить VIEW. – galford13x

3

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

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

+0

Это правда, но сохранение CASE не будет слишком сложным, поскольку я мог бы просто создать VIEW с тем, у кого есть CASE, а затем сохранить VIEW. – galford13x

+0

Это может быть легко для небольшого числа случаев и в качестве исключения, но это все равно следует учитывать. Невзирая на целостность, ее сохранение в представлении не совпадает с поддержанием его в таблице (вы не можете обновлять перевод на основе запроса). – Unreason

+0

Это имеет смысл. Я добавлю таблицу и проведу несколько тестов. Я опубликую результаты, когда закончу. – galford13x

Смежные вопросы