【问题标题】:does the existence of an asterisk in a select exclude other columns?选择中存在星号是否排除其他列?
【发布时间】:2011-11-26 09:19:27
【问题描述】:

这个问题都是关于懒惰的......我想做这样的事情:

select some_func(some_col), * from my_table

这样我就不必这样做了:

select some_func(some_col), col_1, col_2... col_ad_infinitum from my_table

有没有办法让第一个查询工作?这是我运行它时遇到的错误:

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* from my_table' at line 1

【问题讨论】:

  • 第一个查询应该可以正常运行。您的意思是您希望some_col 被排除在查询的* 部分之外吗?如果是这样,不,你不能那样做。这是一个备受争议的问题,唯一的 惰性 方法是使用动态 SQL 来生成查询中的列列表。
  • 您的第一个查询应该可以工作。你试过了吗?
  • Select 的目标是什么?它有什么作用?它是否将数据返回给应用程序?一份报告?如果您更改 my_table,您的查询现在将返回比以前更多的列,这往往会搞砸一些事情。这是一个等待发生的错误。
  • 懒惰而不是(不懒惰)输入50个列名:)
  • @mellamokb:第一个查询没有按原样运行。它会在 MySQL 的 5.1 和 5.5 版本中产生错误。

标签: mysql sql mariadb


【解决方案1】:

您的意思是在 MySQL 中您的第一个查询:

SELECT some_func(some_col), * 
FROM my_table

产生这个错误?:

错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“*”附近使用正确的语法


您可以将代码更改为(这不会导致错误!):

SELECT *, some_func(some_col) 
FROM my_table

或者如果你想先计算列的话:

SELECT some_func(some_col), t.* 
FROM my_table AS t

【讨论】:

  • 有什么建议为什么 MySQL 会在这里抛出错误? FROM 子句应该足够清楚地决定我的意思是什么表......
【解决方案2】:

不幸的是,mysql 只支持列列表的 start 处的星号(与我熟悉的所有其他 DB 不同)

(已编辑:start 不是 end - 哎呀!)

【讨论】:

  • 你的意思是开始,而不是结束。
  • 这可能是因为您熟悉的所有其他数据库都无法像 mysql 一样在同一查询中引用以前的选择字段 :-)
  • @mellamokb:你什么意思?您能否举一个在 MYSQL 中工作的具有此类引用的查询示例?
  • 在 MYSQL 中,你可以做类似select 1 as myval, myval + 2 as myval2 的操作,其中第二个字段中的myval 是对第一个字段输出值的直接引用。我知道您不能在 SQL Server 中执行此操作,但我不确定其他数据库系统。
  • 这看起来很危险。如果其中一个表中还有一个名为 myval 的列怎么办?我希望在这种情况下,查询会因引用不明确而失败...
【解决方案3】:

更改选择参数的顺序:

select *,some_func(some_col) from my_table

无论如何,正如Zen of Python 所说:“显式优于隐式”。始终尝试编写您选择的字段,如果可以尝试放置它们来自的表,您可以使用别名。你的未来你会感谢你的。

select t.some_col from my_table t

【讨论】:

    【解决方案4】:

    当我使用 PostgreSQL 执行此操作时,我得到我指定的列,然后是所有其他列(可能重复我指定的列)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-25
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 2019-08-24
      相关资源
      最近更新 更多