Отфильтруйте эти данные из таблицы, где есть разрыв в последовательности - PullRequest
0 голосов
/ 25 декабря 2018

Я хочу установить флаг допроцесса на 0, если указанные ниже данные пусты между любыми из упомянутых целей

Пример:

create table TestSAMP (
  id int identity(1,1),
  modelid navrchar(max),
  target1 nvarchar(max),
  target2 nvarchar(max),
  target3 nvarchar(max),
  target4 nvarchar(max),
  doprcoess  int default(1)
)

--VALID SET DOPROCESS FLAG TO 1
INSERT INTO TestSAMP(modelid,target1,target2,target3,target4) 
VALUES('1','T1','T2','T3','T4')

--NOTVALID SET DOPROCESS FLAG TO 0 DUE TO THE DATA IS MISSING IN SEQUENCE 
INSERT INTO TestSAMP(modelid,target1,target2,target3,target4)
VALUES('2','TR','','T3','T4')

--VALID SET DOPROCESS FLAG TO 1 As if data is present
-- it should be present insequence in below t1 t2 as they arfe in sequence
INSERT INTO TestSAMP(modelid,target1,target2,target3,target4)
VALUES('3','T1','T2','','')

--NOTVALID SET DOPROCESS FLAG TO 0 DUE TO THE DATA IS MISSING IN SEQUENCE 
--where T4 data is provided and not in T3
INSERT INTO TestSAMP(modelid,target1,target2,target3,target4) 
VALUES('4','T1','T2','','T4')

У меня много решенийгде люди пытаются найти порядковый номер, но здесь случай nvarchar

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Вы можете рассматривать разрывы и острова как строку, то есть 'IGGI', раздавливать его и искать шаблон 'IGI':

SELECT *, CASE WHEN squashed LIKE '%IGI%' THEN 0 ELSE 1 END AS new_doprocess
FROM TestSAMP t
CROSS APPLY(SELECT STRING_AGG(CASE WHEN t = '' THEN 'G' ELSE 'I'END, '') r
             FROM (VALUES (1,id, target1), (2,id, target2),
                          (3,id, target3), (4,id, target4)) sub(rn, id, t)) s
CROSS APPLY (SELECT replace(replace(replace(replace(replace(replace(s.r,'G','<>')
   ,'><',''),'<>','G'),'I','<>'),'><',''),'<>','I')) AS sub(squashed)
ORDER BY t.id;

db <> fiddle demo

Пример:

  id  | target1  | target2  | target3  | target4  |  r    | squashed  | doprocess 
 -----|----------|----------|----------|----------|-------|-----------|----------- 
   1  | T1       | T2       | T3       | T4       | IIII  | I         |         1 
   2  | T1       |          | T3       | T4       | IGII  | IGI       |         0 
   3  | T1       | T2       |          |          | IIGG  | IG        |         1 
   4  | T1       | T2       |          | T4       | IIGI  | IGI       |         0 
   5  |          |          |          | T4       | GGGI  | GI        |         1 
   6  |          |          |          |          | GGGG  | G         |         1 
0 голосов
/ 25 декабря 2018

Самым простым способом должна быть проверка логического выражения, если предшественник пуст, если преемник не является.

UPDATE testsamp
       SET doprocess = 0
       WHERE target2 <> ''
             AND target1 = ''
              OR target3 <> ''
                 AND target2 = ''
               OR target4 <> ''
                   AND target3 = '';

Возможно, вы захотите расширить его, например, если он также недействителен, когда все цели пусты,Я не знаю, хотите ли вы этого.

...