我发现如何在不使用临时表的情况下从值列表中创建结果集:
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中没有这样的语法。有什么想法吗?
答案 0 :(得分:1)
您正在寻找的内容称为"表值构造函数"在SQL标准中,它会像这样工作:
SELECT id FROM (VALUES (12), (155), (139), (11)) AS t(id)
不幸的是,它在MySQL中不可用。据我所知,至少这些数据库支持它:
至少这些数据库并不需要使用UNION ALL
来模拟它:
如果这仅仅是关于语法(而不是性能),您当然也可以查询已知包含至少您正在寻找的值的表,然后简单地使用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中还不存在,但你可以在网上找到几个例子:例如: