SQL для определения того, какие строки следует сохранить, а какие удалить

#pdf #ssis #row #ssms #charindex

#PDF #ssis #строка #ssms #charindex

Вопрос:

Всем доброго утра,

У меня небольшой ментальный блок, и я собирался посмотреть, может ли кто-нибудь мне помочь. У меня есть таблица, в которой перечислены PDF-файлы, созданные нашим офисом. Мы изменили соглашение об именовании, и я пытаюсь разработать логику, которая определяет, когда был создан PDF-файл с новым соглашением об именовании, чтобы пометить старый, чтобы я мог разработать пакетный скрипт для перемещения их из расположения файлов. Ниже приведены некоторые примеры. Кстати, каждый файл — это отдельная строка в таблице.

      PAR                          ORIGFILENAME

 111100000012         |          1100000012.pdf

 111100000012         |          1100000012_C_1_UB.pdf

 111100000012         |          1100000012_R_1.pdf
 

Новое соглашение об именовании содержит _R_Number или _C_Number. В приведенном выше примере первый файл старый, и я хочу сохранить вторые 2.

Второй пример, в котором есть немного больше. Ниже приведены 5 файлов. Я хочу сохранить последние два, которые имеют новое соглашение об именовании, и удалить верхние 3.

     PAR                           ORIGFILENAME

 1100000076                      1100000076-2.pdf

 1100000076                      1100000076-3.pdf

 1100000076                      1100000076.pdf

 1100000076                      1100000076_C_7_BARN.pdf

 1100000076                      1100000076_R_1.pdf
 

Мои планы, если я смогу использовать эти старые файлы, когда появится новый, — превратить эти имена в пакетный скрипт и включить его в пакет SSIS, который будет запускаться еженедельно, чтобы поддерживать чистоту нашего хранилища PDF. Я ценю любую помощь и подстрекательство.

Комментарии:

1. Предположительно, поскольку вы упомянули SSIS, вы используете SQL Server, если это так, пожалуйста, ОТМЕТЬТЕ соответствующим образом.

Ответ №1:

Следующее должно сработать, хотя было бы полезно использовать более разнообразный объем выборочных данных.

Следующее использует обновляемый CTE для идентификации имен старого / нового формата и удаляет старый формат, в котором тот же PAR имеет новый формат

 with f as (
  select *,
    case when OrigFilename like '%*_%' escape '*' then 0 else 1 end del
  from t
)
delete from f
where del=1 
  and exists (select * from f f2 where f2.par=f.par and f2.del=0)
 

Ответ №2:

Если вы пытаетесь выделить записи, которые хотите удалить, и хотите возвращать записи только в старом формате, когда существуют записи C_7 и R_1, может быть, что-то вроде этого?

 ;WITH c_7_records AS (
      SELECT par
        FROM my_table
       WHERE origfilename LIKE '%_C_7_%'
), 
r_1_records AS (
      SELECT par
        FROM my_table
       WHERE origfilename LIKE '%_R_1%'
), 
records_to_remove AS (
      SELECT 
    DISTINCT mt.origfilename
        FROM my_table AS mt
        JOIN c_7_records AS cr ON mt.par = cr.par
        JOIN r_1_records AS rr ON mt.par = rr.par
       WHERE mt.origfilename NOT LIKE '%_C_7_%'
         AND mt.origfilename NOT LIKE '%_R_1%'
)
SELECT * FROM records_to_remove;
        
 

sql скрипка