我从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易于理解的案例陈述。以后可能会派上用场。
答案 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这是实现您想要做的事情的正确方法。这是一个规范化的设计
我认为您在询问设计而不是如何获取数据?如果是这样,那么我应该告诉我一直使用上述设计。
此设计导致规范化数据库。如果您需要更改Invoice
和Online Payment
我建议您将doc_type
字段更改为int
,因为它不仅可以节省空间(如Tordek所述),而且在执行查询时也会更快。
Invoice
更改为Billing
,那么搜索Invoice
需要花费时间,并且必须更新包含此值的每一行< / LI>