替换MySQL结果

时间:2009-10-22 06:00:22

标签: sql mysql

我从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更改为整数是不可能的,因为这是我没有编写的计费应用程序的现有数据库。如果除了在这里和那里添加表格之外我做了任何更改,我最终会破坏功能。

同样感谢Rahul易于理解的案例陈述。以后可能会派上用场。

4 个答案:

答案 0 :(得分:3)

您目前的方式是最好的。可以说,document_type可以更改为int,以节省空间等等,但这是无关紧要的。

与任何链式if相比,进行连接的速度和可读性要快得多。

更不用说,可扩展。如果您需要添加新的doc_type,它只是一个插入而非可能是几个查询。

答案 1 :(得分:2)

您可以使用SQL CASE语句在单个查询中执行此操作。

Select account_number, total_paid, doc_date, 
       case doctype
           when 'IN' then 'Invoice'
           when 'PO' then 'Online Payment'
       end
from table

答案 2 :(得分:0)

这是最好的方法:)

如果doc_type可以是整数,您也可以使用ELT函数,如

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

但它仍然比简单连接更糟糕,因为你必须把这个东西放到每个查询中,每个使用数据库的应用程序,以及改变描述都会变得很糟糕。

答案 3 :(得分:0)

IIRC这是实现您想要做的事情的正确方法。这是一个规范化的设计

我认为您在询问设计而不是如何获取数据?如果是这样,那么我应该告诉我一直使用上述设计。

此设计导致规范化数据库。如果您需要更改InvoiceOnline Payment

等字段的名称,则不会出现一致性问题

我建议您将doc_type字段更改为int,因为它不仅可以节省空间(如Tordek所述),而且在执行查询时也会更快。

  • 首先。如果你在doct_type中使用Invoice作为字符串,那么问题可能就是字符串搜索与其他数据类型相比非常慢。
  • 其次,它区分大小写(可能会导致错误。
  • 第三,由于字符串占用了大量空间,因此需要更多空间将其存储在主表中。
  • 第四,如果您需要将名称Invoice更改为Billing,那么搜索Invoice需要花费时间,并且必须更新包含此值的每一行< / LI>