值列表到没有UNION ALL的结果集中

时间:2014-08-15 07:48:56

标签: mysql

我发现如何在不使用临时表的情况下从值列表中创建结果集:

select 12 as id
union all
select 155 as id
union all
select 139 as id
union all
select 11 as id

此结果集可以在以后的各种连接中使用。

现在我正在寻找缩短传递给MySQL的SQL字符串的可能性。理想情况下可能会有:

select (12, 155, 139, 11) as id;

但MySQL中没有这样的语法。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您正在寻找的内容称为"表值构造函数"在SQL标准中,它会像这样工作:

SELECT id FROM (VALUES (12), (155), (139), (11)) AS t(id)

不幸的是,它在MySQL中不可用。据我所知,至少这些数据库支持它:

  • CUBRID
  • DB2
  • 德比
  • HSQLDB
  • 的PostgreSQL
  • SQL Server
  • Sybase ASE

至少这些数据库并不需要使用UNION ALL来模拟它:

  • MS Access
  • 火鸟
  • 的Informix
  • 的Ingres
  • MariaDB的
  • MySQL的
  • 甲骨文
  • SQLite的
  • Sybase SQL Anywhere

使用IN谓词

的解决方法

如果这仅仅是关于语法(而不是性能),您当然也可以查询已知包含至少您正在寻找的值的表,然后简单地使用IN谓词列出值:

SELECT id FROM some_table WHERE id IN (12, 155, 139, 11)

当然,这可能比UNION ALL解决方案慢得多。

但从语法上讲,这是一个明显的解决方法,根据SQL标准,IN谓词"在值列表"实际上只是#34;表值构造函数的语法糖" (虽然,我不相信任何SQL引擎真正实现了替代语法):

8.4 <in predicate>

2) Let IVL be an <in value list>.

   ( IVL )

   is equivalent to the <table value constructor>:

   ( VALUES IVL )

答案 1 :(得分:-1)

我不确定你的意思,但你可以使用group_concat函数从值列表中生成一个list-as-string:

select group_concat(x.id ', ') as idList from 
(
select 12 as id
union all
select 155 as id
union all
select 139 as id
union all
select 11 as id
) x

更新:如果你真的想要做相反的事情,即通过逗号分隔的列表(例如select '12, 155, 139, 11' as id以便在数据库中使用,那么你&#39;我需要一个SPLIT函数:这在mysql中还不存在,但你可以在网上找到几个例子:例如:

http://lists.mysql.com/mysql/199134