选择特定的列,以及其他列

6

我有一张表格,它有许多列。其中一些是DATETIME类型的,我使用UNIX_TIMESTAMP()将其转换为Unix时间戳。那么,如果我不想手动输入我需要的其他列,有没有什么办法可以做到像这样:

SELECT UNIX_TIMESTAMP(t.start) AS start,
       UNIX_TIMESTAMP(t.end) AS end,
       t.theOtherColumns
FROM table t

当我想选择表中的所有列,并对其中某些列执行操作时,可以使用t.theOtherColumns表示表中的其他列。进一步解释一下:我不想在查询中逐个输入每个列名。

例如,当我进行如下操作:

SELECT UNIX_TIMESTAMP(t.start) AS start,
       UNIX_TIMESTAMP(t.end) AS end,
       t.theOtherColumns
FROM table t

它两次选择startend。我只想从UNIX_TIMESTAMP()返回startend列,并从t.*集中排除这些列。


@Zoltan - 但是这样会把t,startt.end也带回来。顺便说一下,这个问题的答案是“不”。 - Martin Smith
好的,我明白了。那我认为这是不可能的... - HamoriZ
或者您可以使用获取数据的任何编程语言在服务器端删除那些额外的值。 - Brian Glaz
感谢您所有的评论。我将坚持逐个输入 - 只需要针对一个或可能两个查询。 - Bojangles
@JamWaffles,请看一下我在下面的回答,它应该能够给出这个问题所寻找的结果。如果你认为这是一个更准确的答案,我建议你将其标记为答案,以便其他用户更容易地找到它。我知道你已经问了这个问题有一段时间了,但我希望我的答案可以帮助你和其他人。 - donL
显示剩余3条评论
3个回答

5
你可以使用这个答案来帮助构建你想要的结果。
一个可能的解决方案如下:
SET @sql = CONCAT('SELECT UNIX_TIMESTAMP(t.start) AS start, UNIX_TIMESTAMP(t.end) as end,', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM 
information_schema.columns WHERE table_schema = 'test' AND table_name = 
't' AND column_name NOT IN ('start', 'end')), 
' from test.t');  
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

*将test替换为包含您的表t的模式的名称。


4

尝试在Oracle下使用t.*,它是可行的。


1

我不相信有一种像你建议的那样做的方法,但你可以这样做

SELECT t.*, UNIX_TIMESTAMP(t.start) AS start, UNIX_TIMESTAMP(t.end) as end ...

这是可以做到的。请看下面我的回答。 - donL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接