Заменить MySQL результат - PullRequest
       20

Заменить MySQL результат

1 голос
/ 22 октября 2009

Я получаю следующие данные из базы данных MySQL

    +----------------+------------+---------------------+----------+
    | account_number | total_paid | doc_date            | doc_type |
    +----------------+------------+---------------------+----------+
    |             18 |    54.0700 | 2009-10-22 02:37:09 | IN       |
    |            425 |    49.9500 | 2009-10-22 02:31:47 | PO       |
    +----------------+------------+---------------------+----------+

Запрос в порядке, и я получаю необходимые данные, за исключением того, что doc_type не очень удобен для чтения человеком. Чтобы это исправить, я сделал следующее

CREATE TEMPORARY TABLE doc_type (id char(2), string varchar(60));
INSERT INTO doc_type VALUES 
 ('IN', 'Invoice'),
 ('PO', 'Online payment'),
 ('PF', 'Offline payment'),
 ('CA', 'Credit adjustment'),
 ('DA', 'Debit adjustment'),
 ('OR', 'Order'); 

Затем я добавляю объединение к этой временной таблице, чтобы легче было читать мой столбец doc_type, который выглядит следующим образом

+----------------+------------+---------------------+----------------+
| account_number | total_paid | doc_date            | document_type  |
+----------------+------------+---------------------+----------------+
|             18 |    54.0700 | 2009-10-22 02:37:09 | Invoice        |
|            425 |    49.9500 | 2009-10-22 02:31:47 | Online payment |
+----------------+------------+---------------------+----------------+

Это лучший способ сделать это? Можно ли заменить текст одним запросом? Я начал смотреть на утверждения if, но, похоже, это не то, что мне нужно, или, может быть, я просто неправильно их прочитал.

// РЕДАКТИРОВАТЬ //

Спасибо всем. Я полагаю, я буду продолжать делать это так.

К сожалению, невозможно изменить doc_type на integer, поскольку это существующая база данных для приложения для выставления счетов, которое я не написал. Я бы в конечном итоге нарушил функциональность, если бы внес какие-либо изменения, кроме добавления таблицы здесь и там.

Также оцените простое для понимания заявление Рахула. Может пригодиться позже.

Ответы [ 4 ]

3 голосов
/ 22 октября 2009

Ваш нынешний путь самый лучший. Возможно, document_type можно изменить на int, чтобы сэкономить место и еще много чего, но это не имеет значения.

Выполнение объединения будет намного быстрее и удобочитаемее, чем любое связанное if с.

Не говоря уже, расширяемый. Если вам нужно добавить новый doc_type, это просто вставка против нескольких запросов.

2 голосов
/ 22 октября 2009

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

Select account_number, total_paid, doc_date, 
       case doctype
           when 'IN' then 'Invoice'
           when 'PO' then 'Online Payment'
       end
from table
0 голосов
/ 22 октября 2009

IIRC - это правильный способ достичь того, что вы хотите сделать. Это нормализованный дизайн

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

Этот дизайн приводит к нормализации базы данных. Не будет проблем с согласованностью, если вам когда-либо потребуется изменить имя поля, например Invoice и Online Payment

Я бы предложил вам изменить поле doc_type на int, поскольку оно не только экономит место (как сказал Тордек), но и быстрее при выполнении запросов.

  • Во-первых. Если вы использовали Invoice в doct_type в качестве строки, то проблема могла заключаться в том, что поиск строки был чрезвычайно медленным по сравнению с другими типами данных.
  • Во-вторых, он чувствителен к регистру (что может привести к ошибкам.
  • В-третьих, поскольку строка занимает много места, для ее хранения в основной таблице требуется гораздо больше места.
  • В-четвертых, если вам когда-либо потребуется изменить имя Invoice на «Billing», тогда поиск Invoice займет время, и каждая строка, содержащая это значение, должна быть обновлена ​​
0 голосов
/ 22 октября 2009

Это лучший способ сделать это:)

Если doc_type может быть целым числом, вы также можете использовать функцию ELT, как в

SELECT ELT(doc_type, 'Invoice', 'Document') FROM table;

но это все же хуже, чем простое объединение, так как вам приходится помещать эту вещь в каждый запрос и каждое приложение, использующее базу данных, и изменение описания становится адом.

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