Oracle SQL - 由char cast组

时间:2016-06-08 15:20:31

标签: sql oracle oracle11g group-by

在group-by子句中使用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));

结果是'Abc '(10个字符长)。 直观地说,我原以为Oracle会返回以下其中一项:

  • 错误:'不是分组表达式',因为group-by子句不是选择子句
  • 长度为2 'Ab'的结果。

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

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

我正在使用Oracle SQL 11g。

1 个答案:

答案 0 :(得分:2)

如上所述,我认为存在误解。 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. (长度([STRING])< [B] OR LENGTH([STRING]> [B])和[A] = LENGTH([STRING])
  2. (LENGTH([STRING])= [B] AND [A]<> LENGTH([STRING]))
  3. 否则,它会返回一行。

    但是如果你把你的例子运行并在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上失败:字符串连接的结果太长。

    ...好奇