Вернуть значение столбца только один раз в строке 1 и вернуть NULL для других строк - PullRequest
1 голос
/ 13 февраля 2020
select col1, col2, col3 from table where *some condition*

Здесь количество возвращаемых строк неопределенно, но значение для col2 будет таким же. Я хочу отображать значение col2 только в первой строке и отображать как NULL в других строках.

Как сделать это, не усложняя запрос слишком сильно?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Вы можете использовать row_number(), но подзапрос не нужен:

select
    col1,
    case when row_number() over(partition by col2 order by col1, col3) = 1 then col2 end col2
    col3
from mytable t
where ...
order by t.col2, col1, col3

Обратите внимание, что для того, чтобы это работало (и чтобы ваш вопрос имел смысл вообще), вам нужны некоторые вид порядка упорядочения в наборе результатов, поэтому его можно однозначно указать с помощью строки: first . Я предположил, что вы хотите упорядочить строки, используя два других столбца (и я также упорядочил набор результатов соответственно).

Также обратите внимание, что это решение должно работать одинаково хорошо, если имеется более одного отдельного col2 в набор результатов; результаты будут отсортированы, и будет отображаться только первый случай заданного значения col2.

1 голос
/ 13 февраля 2020

Вы можете использовать row_number():

select t.col2, (case when t.seq = 1 then t.col2 end) as col2, t.col3
from (select t.col1, t.col2, t.col3,
             row_number() over (partition by t.col2 order by ?) as seq
      from t
      where . . . 
     ) t;
...