2017-12-27 248 views
1

里面我用子查询CASE声明,并在子查询我们希望与自动序列值或计数器值一起一列。例如 CASE声明里面查询就是这样的,我们通过一列col1WHERE的条件下&得到输出col2以及CNT里面的CASE语句使用子查询与生成序列ID

(CASE WHEN (SELECT COL2, ROWNUM AS CNT FROM TAB1 WHERE COL1 = COL1) THEN ....) 

每当任何值col1将匹配,则col2的输出将被与CNT增量值产生沿。

CNT是这里计数器的值等1,2,3,4,.....哪一个是更好的选择或者使用计数器序列

+3

似乎查询不作任何意义吗? CASE的WHEN子句必须评估为“true”或“false”,而不是数据表。 –

+0

在Oracle中,我只会使用'rownum'。 –

回答

1

“哪一个是更好的选择,或者使用计数器或序列。”

您是否总是希望CNT以1开头?如果是这样,你不想要一个序列。

有许多不同的方法可以为CNT生成一个值。最简单的就是使用rownum伪列:

SELECT COL1, rownum as CNT FROM TAB1 WHERE 

这是一个很好的解决方案,当你不小心给定行是否是1299999。如果你有一些特殊的要求,你可能要使用的解析函数像row_number()代替:

SELECT COL1, row_number() over (order by COL2) as CNT FROM TAB1 WHERE 
+1

请检查一次编辑。这里传递一个参数&获得第二列与计数器。 –

+0

对不起,但我不明白你的意思。请提供一些示例输入数据和您的预期输出。 – APC

+0

但我没有得到增量值时,我使用row_number()以及rownum两者。我想增加值,如1,2,3,4 ... –

1

一般来说,“更好”取决于你想要做什么。

有几个可能的情形:

  1. 你集返回给调用一些代码/用户的结果。调用序列可能是不必要的开销,并且不允许使用更复杂的行编号表达式。

    在这种情况下,我会使用哪个最适合的rownum和各种分析行编号函数,row_number()rank()dense_rank()

    由于您的查询是如何构建的很可能是你应该使用这种方法的。

  2. 您正在将此数据插入表中。我更喜欢序列是一个标识列或在12c之前,在触发器。这是因为除了单个语句之外的其他代码可能会执行插入操作,并且您希望确保更改表中数据的所有传入数据都以相同方式处理。

    换句话说,不要在您的代码中使用序列来执行此操作。

  3. 您正在生成一个唯一标识,您将向用户显示并插入表中。如果您有手动批准步骤,这种结构最有用。由于(2)中详述的原因,您要使用序列来确保数据处理相同。

    另一种可能会导致锁定的方法是执行插入操作,然后向用户显示未提交的数据。用户然后必须提交或回滚适当的。

    如果您正在进行这些操作,您将失去未提交的序列值。这根本不重要,但由于某种原因它困扰了一些人。