例如,我有一个名为"form_type"的列,由int(1-4(组成
id_event|form_type
--------|----------
001 |1
001 |3
001 |4
002 |2
002 |1
当我查询时
从
some_table
中选择form_type
,其中id_event
= 001
我当然会得到 1,3 和 4。但是,是否可以将这些值更改为数据库层上的其他值?例如,我会得到字符串而不是像这样 int,1 = 'Name',3 = '电子邮件',4 = '城市'等。如果可能,查询是什么?还是唯一的方法是在应用程序端?
是的,你可以这样做:
SELECT
CASE
WHEN form_type = 1 THEN 'Name'
WHEN form_type = 3 THEN 'Email'
WHEN form_type = 4 THEN 'City'
ELSE 'some default value'
END
FROM some_table
WHERE id_event = 001
使用CASE
可以定义要为表中的值返回的内容。CASE
这里的例子。
希望对您有所帮助!
SELECT ELT(form_type, 'Name', 'Unknown', 'Email', 'City')
FROM some_table
WHERE id_event = 001
ELT(( 函数
但我建议创建一个存储数字和字符串之间关系的表,并将其连接到查询中以获取字符串而不是 int。
正常的方法是在数据库中有一个包含此信息的参考表。 然后你会使用JOIN
:
create table forms (
form_type int primary key,
name varchar(255)
);
insert into forms (form_type, name)
values (1, 'Name'),
(2, ???), -- unclear what goes here
(3, 'Email'),
(4, 'City');
然后使用JOIN
获取名称:
select t.*, f.name
from t join
forms f
using (form_type);
为什么要将此信息存储在数据库中? 简单:一致性!
如果开始在查询中使用CASE
表达式,则会使问题激增。 这是有风险的:
- 大小写表达式可能使用不同的字符串(例如,"电子邮件"与"电子邮件"(。
- 如果添加新表单,则必须更改大量代码。
- 如果你决定改变某物的名称,那么你必须改变很多代码。
您希望数据存储在表中。您不希望在代码中将其实现为业务规则,因为这很脆弱且容易出错。
我应该指出,MySQL确实提供了显式引用表的两种替代方案。 如果仅在一个表中使用form_type
,则enum
是一种方便的替代方法。 或者,可以使用表中生成的列来生成字符串。