#sql #db2 #numbers #sequence #db2-400
#sql #db2 #числа #последовательность #db2-400
Вопрос:
У меня есть таблица A, которая содержит 5 столбцов от col1 до col5. всего она содержит 6 строк.Я использую DB2 sql
Ниже приведены данные для col2.
A
A
test
testasfdla
Null
Null
Требование:-
Если col2 содержит null, мне нужно присвоить порядковый номер, начинающийся с 1.
исключенный o / p:-
Ниже приведены данные для col2.
A
A
test
testasfdla
1
2
Я попытался с помощью row_number, но не получил требуемого ввода-вывода.
Комментарии:
1. Как вы пытались с
row_number()
? Как вы упорядочили данные, если это важно для вас ? Вы имеете в виду обновление столбца с помощью assign или нового производного столбца в инструкции SELECT?2. Создайте a
BEFORE INSERT TRIGGER
, который будет проверятьcol2
наличиеnull
и использовать aSEQUENCE
для назначения увеличивающихся чисел, если это так.
Ответ №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
Комментарии:
1. Спасибо за ввод, и он работает. но если я удалю РАЗДЕЛ с помощью предложения C, почему я получаю выходные данные как 5 и 6. Как db2 удостоверится, что NULL присваивается последним?
2. Функция с
partition
предложением просто перечисляет все строки с одинаковыми значениямиC
независимо. Вам не нужно использовать такое перечисление для ненулевых значений с таким выражением. Поэтому не удаляйте это предложение, если вы не хотите нарушать необходимую функциональность.3. Добавьте ПОРЯДОК ПО c desc после раздела по части C, и вы получите 1 и 2 в качестве чисел для нулей
4. @MichaelTiefenbacher
Order by
тот же столбец, что и вpartition by
предложении, бесполезен — это то же самое, что упорядочивание по константе. Для некоторых продуктов баз данных требуетсяorder by
предложение в этой функции, но не Db2.5. @MarkBarinstein Это была опечатка при воспроизведении запроса. Хороший пример выполнения находится в db<>fiddle .