【问题标题】:sequence number generation in db2db2 中的序列号生成
【发布时间】:2020-11-26 18:15:00
【问题描述】:

我有一个包含 5 列 col1 到 col5 的表 A。它总共包含 6 行。我正在使用 DB2 sql

下面是 col2 的数据。

A
A
test
testasfdla
Null
Null

要求:- 如果 col2 包含 null 我需要分配从 1 开始的序列号。

例外 o/p:-

下面是 col2 的数据。

A
A
test
testasfdla
1
2

我尝试使用 row_number,但没有得到所需的 o/p。

【问题讨论】:

  • 您是如何尝试使用 row_number() 的?如果数据对您很重要,您是如何排序的?您的意思是在 SELECT 语句中通过分配或新的派生列来更新列?
  • 创建一个BEFORE INSERT TRIGGER,它将检查col2 中的null,如果是,则使用SEQUENCE 分配递增的数字。

标签: sql db2 numbers sequence db2-400


【解决方案1】:

试试这个:

WITH T (C) AS 
(
VALUES
  'A'
, 'A'
, 'test'
, 'testasfdla'
, Null
, Null
)
SELECT COALESCE(C, TO_CHAR(ROW_NUMBER() OVER (PARTITION BY C)))
FROM T

【讨论】:

  • 感谢您的输入,它正在工作。但是如果我删除 PARTITION BY C 子句为什么我得到输出为 5 和 6 。db2 如何确保最后分配 NULLS?
  • 带有partition 子句的函数只是独立地枚举C 中具有相同值的所有行。对于具有此类表达式的非 NULL 值,您不需要不要使用此类枚举。因此,如果您不想破坏所需的功能,请不要删除此子句。
  • 在 C 部分分区后添加 ORDER BY c desc,您将得到 1 和 2 作为 NULL 的数字
  • @MichaelTiefenbacher Order bypartition by 子句中的同一列是无用的 - 它与按常量排序相同。某些数据库产品需要此函数中的 order by 子句,但 Db2 不需要。
  • @MarkBarinstein 玩查询时打错字了。运行良好的示例位于db<>fiddle
猜你喜欢
  • 2010-12-29
  • 1970-01-01
  • 2023-04-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多