【问题标题】:Oracle SQL - group by char castOracle SQL - 按字符转换分组
【发布时间】:2016-10-08 23:11:37
【问题描述】:

在 group-by 子句中使用 a char-cast 会产生意想不到的结果:

select cast(col as char(2)) from (
  select 'Abc' as col from dual
  union all
  select 'Abc' as col from dual
) group by cast(col as char(10));

结果为@​​987654323@(10 个字符长)。 直觉上,我预计 Oracle 会返回以下内容之一:

  • 错误:'not a group-by expression',因为 group-by 子句不是选择子句
  • 长度为 2 'Ab' 的结果。

cast(col as char(2)) 替换为cast(col as char(3)),Oracle 返回错误“不是分组表达式”。这又是一个非常奇怪的行为。

如何解释?背后的原因是什么?

我正在使用 Oracle SQL 11g。

【问题讨论】:

  • 我刚刚在 11g 上进行了测试,它对 1-11 的值产生了相同的结果,除了 3。确实很奇怪。对我来说,这似乎是一个错误。返回应该是'Ab'。如果使用聚合函数,则会返回预期值。
  • 为什么在不使用聚合函数的查询中使用 group by?
  • 可能是oracle误解了查询的意图造成的。试试看这个:stackoverflow.com/q/25792979/2436051.
  • @JensKrogsboell 我尝试使用 NO_QUERY_TRANSFORMATION 提示,但没有效果。

标签: sql oracle oracle11g group-by


【解决方案1】:

如上所述,我认为存在误解。 o.O

我无法解释为什么会这样,但这是您所拥有的查询类型的模式:

如果你把它概括一下,其中 [A] 和 [B] 是整数,而 [STRING] 是你想要的任何文本:

select cast(col as char([A])) from (
  select '[STRING]' as col from dual
  union all
  select '[STRING]' as col from dual
) group by cast(col as char([B]));

如果以下两个条件之一为真(可能还有其他条件),这似乎总是失败:

  1. ( LENGTH([STRING]) [B]) and [A] = LENGTH([STRING])
  2. ( 长度([STRING]) = [B] AND [A] 长度([STRING]) )

否则,它将返回一行。

但是,如果您将运行示例并在 CREATE TABLE 语句中使用它,它将失败,因为它将列宽设置为 2 并且无法容纳传入的 3 字符串。

更奇怪的是,如果您在字符串的开头和结尾附加一些内容,如下所示:

select '\*'||cast(col as char([A]))||'\*' from (
  select '[STRING]' as col from dual
  union all
  select '[STRING]' as col from dual
) group by cast(col as char([B]));

这仅在 [A] >= [B] 时有效,否则在 ORA-01489 上失败:字符串连接的结果太长。

好奇...

【讨论】:

  • 感谢您的回答和问题的抽象。这确实仍然是一种非常奇怪的行为。我没有将答案标记为正确,因为它更多的是对我的问题的补充而不是解释。
猜你喜欢
  • 1970-01-01
  • 2020-12-06
  • 2019-09-13
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多