SQLite дорогой оператор CASE? - PullRequest
10 голосов
/ 02 апреля 2010

Мне интересно, не рекомендуется ли использовать оператор 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.

Ответы [ 3 ]

11 голосов
/ 02 апреля 2010

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

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

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

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

3 голосов
/ 02 апреля 2010

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

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

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