【问题标题】:select from values in mysql从mysql中的值中选择
【发布时间】:2012-03-02 05:28:35
【问题描述】:

从值中进行选择的 MySQL 方法是什么?

select c from (values (1), (2), (3)) as t(c);

这个想法是能够做这样的事情:

select * from table, (values (1), (2), (3)) as temp(c) where ...;

作为参考,这里是 Postgres 文档: http://www.postgresql.org/docs/9.1/static/sql-values.html

【问题讨论】:

    标签: mysql postgresql select


    【解决方案1】:

    在 MySQL 8.0.19 中,支持此语法。请参考这个official link

    mysql> VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8);
    +----------+----------+----------+
    | column_0 | column_1 | column_2 |
    +----------+----------+----------+
    |        1 |       -2 |        3 |
    |        5 |        7 |        9 |
    |        4 |        6 |        8 |
    +----------+----------+----------+
    

    【讨论】:

    • 在 MariaDB 10.3 中,它是 VALUES (1,-2,3), (5,7,9), (4,6,8);
    【解决方案2】:

    这是解决MySQL 中缺乏WITH 支持的另一种方法:

    create temporary table tmp (c int);
    
    insert into tmp (c)
    values (1), (2), (3);
    
    select * from tmp;
    

    【讨论】:

    • 谢谢你的回答,太伤心了。
    【解决方案3】:

    从您提供的链接:

    值 (1, '一'), (2, '二'), (3, '三');
    这将返回一个两列三行的表格。它实际上相当于:
    选择 1 作为列 1,“一个”作为列 2
    联合所有
    选择 2,“两个”
    联合所有
    选择 3,“三”;

    所以你需要

    select * from 
    table1,
    (
       SELECT 1 AS val
       UNION ALL
       SELECT 2
       UNION ALL 
       SELECT 3 
    )b
    

    【讨论】:

    • 这与我的示例等效,但与 Postgres 语法相比似乎需要做很多工作。 MySQL有这样的选择吗?
    • 由于 MySQL 没有任何 VALUES 语法,因此需要做更多的工作。如果您有许多需要检索的值,您可以创建一个过程来通过分隔符拆分您的值,将它们插入到临时表中,然后正确选择它们。这对你来说会更容易吗?
    • 其实我不想检索这些值。我想做一些比“in”更复杂的事情,所以我需要它们在某种临时表中
    • @cristism:根据 Postgres 所说,我得出结论,在这种情况下,它的 VALUES 只是语法糖,所以UNION ALL 没有性能损失......是的,UNION 语法更冗长...
    • @StelianMatei 使用临时表实现相同的语法是什么?
    猜你喜欢
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 2020-11-02
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多