Выполняем операцию для каждой строки в выборке Transact SQL

Задача: определить, есть ли в выборке несколько идущих подряд строк с определенными значениями, например три строки подряд (если просто три, то задача легко решается) с ненулевым значением числового поля. Задача очень простая в алгоритмических языках, но несколько не очевидная в декларативном языке SQL. В принципе перебирать строки в выборке можно с помощью курсора, но это крайне медленное и громоздкое решение. Есть более быстрый и простой, но крайне неочевидный путь выполнить последовательную обработку каждой строки прямо внутри select - собирать значения в строку.

select @sum_string =  @sum_string 
 +  case when INT_FIELD = 0 then '0' else  '1' end 
 +  ',' 
from SOME_TABLE

-- если INT_FIELD будет примерно таким 6000, 6, 0, 2100, 11000, 1, 0 то мы получим строку вида 1,1, 0, 1, 1, 1, 0
-- которую можно проанализировать банальной строковой функцией
-- само собой можно использовать этот метод для склейки всех значений колонки выборки в одну строку

declare @has_triple_not_zero int
set  @has_triple_not_zero = 0;

if @sum_string like '%1,1,1%'
begin
 set @has_triple_not_zero = 1
end

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>