如何使用MySQL SELECT创建虚拟列?


70

如果我选择SELECT AS b并且b不是表中的列,查询会创建“虚拟”列吗?

实际上,我需要将一些虚拟列合并到查询中,并将一些信息处理到查询中,以便以后可以在每个项目中使用它。


1
我已经读过几次这个问题了,肯定有一些我想念的东西。您能否确切说明您要查找的内容?
lc。

1
将查询想象成行和列的数组。通常,我只是通过简单的SELECT * FROM从表结构继承列,但是现在,我需要向其中插入自己的列。
Skuta

2
也许你应该采取一个看看文件..

Answers:


91

就像是:

SELECT id, email, IF(active = 1, 'enabled', 'disabled') AS account_status FROM users

这使您可以进行操作并将其显示为列。

编辑:

您还可以使用联接并将操作显示为列:

SELECT u.id, e.email, IF(c.id IS NULL, 'no selected', c.name) AS country
FROM users u LEFT JOIN countries c ON u.country_id = c.id

这篇文章使我对简单的mysql语句的了解向前发展了:),这是否意味着我可以创建任何“列”?
Skuta

1
但是您不能使用此新列进行操作或进行新的IF评估...还是可以?
2013年

1
您可以使用它来过滤行。尽管必须将条件放入HAVING子句中,而不是将条件放入WHERE子句中:例如,HAVING country ='Germany'。
marsbear 2015年

67

如果要在select语句中创建虚拟列“ age”,请尝试以下方法:

select brand, name, "10" as age from cars...

1
好招 很简单,但是我以前从未尝试过。这正是我想知道的!:D
Atomox 2012年

这是在相同的mysql查询中使用其他表的一个复杂技巧:SELECT tpt。*,(SELECT COUNT(*)FROM where WHERE tpt.id = places.type)as obj_count FROM places_typesas tpt ORDER BY tpt.name ASC LIMIT?,?
realmag777

在创建并集时,这是一个特别好的技巧,因为这有利于知道行的哪个部分来自联合。只需在每个选择中放入一个不同的常量即可识别该行来自哪个块。以及一百万个其他用途。
scott8035

14

您可以将虚拟列添加为

SELECT '1' as temp

但是,如果您尝试将条件放在附加生成的列中,则它将无法正常工作,并且会显示错误消息,因为该列不存在。

我们可以通过以表形式返回sql结果来解决此问题。

SELECT tb.* from (SELECT 1 as temp) as tb WHERE tb.temp = 1

3

SELECT只从数据库中检索数据,它不会更改表本身。

如果你写

SELECT a AS b FROM x

“ b”只是查询中的别名。它不会创建额外的列。您在示例中的结果将只包含一个名为“ b”的列。但是表中的列将保留为“ a”。“ b”只是另一个名字。

我真的不明白您的意思是“所以以后我可以在每个项目中使用它”。您是指稍后在select语句中还是稍后在应用程序中。也许您可以提供一些示例代码。


1

您可以使用CASE语句,例如

SELECT name
       ,address
       ,CASE WHEN a < b THEN '1' 
             ELSE '2' END AS one_or_two
FROM ...

0

您的语法将为a创建一个别名b,但是它的作用域不会超出语句的结果。听起来您可能想创建一个VIEW

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.