【问题标题】:Oracle select query that create dummy column with hardcoded value使用硬编码值创建虚拟列的 Oracle 选择查询
【发布时间】:2014-08-19 12:17:42
【问题描述】:

我有这些记录,我想创建一个 oracle 选择查询来生成具有 1、2、3 作为值的虚拟列。请帮忙谢谢。

field1

one
two
three
four
five 
six
seven
eight

基本上我只想添加值从 1 到 3 的虚拟列。一旦达到 3,它就会再次回到 1。

field1   dummycol
one       1
two       2
three     3
four      1
five      2
six       3
seven     1
eight     2

【问题讨论】:

  • 您希望每个有序的第三个书面数字都是相同的数字吗?例如,您需要一、四和七都为 1 吗?

标签: oracle row-number


【解决方案1】:

您在此处使用的机制是将固定值包含为命名列,例如

select '1' as one

对于您的情况,请使用类似

select '1' as one, '2' as two, '3' as three, '1' as four, '2' as five, '3' as six, '1' as seven, '3' as eight

当您合并多个查询并希望结果表明每个来源的某些信息时,这种机制通常会发挥作用,例如

select name, date, 'student' as Type from student
union
select name, date, 'teacher' as Type from teacher
union
select name, date, 'alumni' as Type from alumni

【讨论】:

    【解决方案2】:

    一个简单的方法是使用rownum伪列和mod函数:

    select field1, mod(rownum - 1, 3) + 1
    from <your table>;
    

    SQL Fiddle

    但是,如果查询 has an order-by clause,甚至是 in a subquery,并且您可能确实想要强制执行某些命令并将循环编号与最终命令联合起来,则这不会像预期的那样工作。

    您可以使用解析 row_number() 函数来代替:

    select field1,
      mod(row_number() over (order by null) - 1, 3) + 1 as dummycol
    from <your table>
    order by field1;
    
    FIELD1     DUMMYCOL
    ---------- --------
    eight             1
    five              2
    four              3
    one               1
    seven             2
    six               3
    three             1
    two               2
    

    SQL Fiddle

    【讨论】:

      猜你喜欢
      • 2019-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2015-11-25
      • 2011-06-18
      • 1970-01-01
      • 2020-09-09
      相关资源
      最近更新 更多