【问题标题】:How to create virtual column using MySQL SELECT?如何使用 MySQL SELECT 创建虚拟列?
【发布时间】:2010-10-02 02:23:59
【问题描述】:

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

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

【问题讨论】:

  • 我已经读了几次这个问题,一定有一些我遗漏的东西。你能澄清一下你在找什么吗?
  • 将查询想象为行和列的数组。通常,我只是通过简单的 SELECT * FROM 从表结构中继承列,但现在,我需要向其中插入我自己的列。
  • 也许你应该一个看看文档..

标签: php mysql select


【解决方案1】:

类似:

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 语句的了解向前推进了 :),这是否意味着我可以创建任何“列”??
  • 但是您不能使用这个新列来进行操作或新的 IF 评估......或者是吗?
  • 您可以使用它来过滤行。而不是将条件放入 WHERE 子句中,尽管您必须将其放入 HAVING 子句中:例如 HAVING country='Germany'。
【解决方案2】:

如果你想在 select 语句中创建一个虚拟列“age”,试试这个:

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

【讨论】:

  • 好把戏。很简单,但我以前从未尝试过。这正是我想知道的! :D
  • 这是一个在同一个 mysql 查询中处理另一个表的复杂技巧:SELECT tpt.*, (SELECT COUNT(*) FROM places WHERE tpt.id=places.type) as obj_count FROM places_types as tpt ORDER BY tpt.name ASC LIMIT ?,?
  • 这是一个特别好的技巧,用于创建联合时,知道一行来自联合的哪个部分是有利的。只需在每个选择中添加一个不同的常量,以标识该行来自哪个块。还有一百万种其他用途。
【解决方案3】:

您可以将虚拟列添加为

SELECT '1' as temp

但是,如果您尝试将 where 条件添加到额外生成的列,它将不起作用,并且会显示错误消息,因为该列不存在。

我们可以通过将sql结果作为table.ie返回来解决这个问题,

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

【讨论】:

    【解决方案4】:

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

    如果你写

    SELECT a AS b FROM x
    

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

    我不太明白您所说的“所以我以后可以将它用于每个项目”是什么意思。您是指稍后在 select 语句中还是在您的应用程序中稍后。或许你可以提供一些示例代码。

    【讨论】:

      【解决方案5】:

      您可以使用 CASE 语句,例如

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          MariaDB Docs。虚拟列是通过在列中添加关键字VIRTUAL 来创建的,同时在其之前添加一个表达式。好消息:您可以向虚拟列添加索引。如果您需要实际值并且担心存储速度过快,请使用PERSISTENT 列。

          【讨论】:

            猜你喜欢
            • 2015-05-14
            • 2012-05-28
            • 1970-01-01
            • 2021-09-08
            • 1970-01-01
            • 1970-01-01
            • 2017-08-21
            • 2012-07-11
            • 1970-01-01
            相关资源
            最近更新 更多