Как мне быстро массово обновлять значения в эффективном запросе?

#sql #sql-server #string #sql-update #where-clause

#sql #sql-сервер #строка #sql-обновление #where-предложение

Вопрос:

У меня есть 3 таблицы, которые содержат один и тот же столбец, Report Year

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

Те годы, которые не имеют суффиксов и являются просто автономными (например, 2020, 2021 и т. Д.), Я хотел бы добавить к ним суффикс «LTP», Чтобы они стали похожими на «2020 LTP», «2021 LTP» и т. Д… Те, которые являются автономными годами, НО начинаются с символов, таких как BP19, НЕ ДОЛЖНЫ ОБНОВЛЯТЬСЯ!

псевдозапрос:

 UPDATE table1, table2, table3
SET 
    [Report Year] = [Report Year].append(' LTP')
WHERE
    [Report Year].count < 5;
  

Я использую count как условие в своем псевдокоде, поскольку это единственный способ сделать запрос достаточно умным, чтобы распознать, какой год имеет суффикс, а какой нет, чтобы он мог соответствующим образом добавить суффикс ‘LTP’. Если есть лучший способ сделать это, я бы хотел его увидеть 🙂

Пример значений в столбце Год отчета:

Table1 (в качестве первичного ключа используется год отчета, следовательно, только уникальные / отличные значения):

 Report Year
2020 5 7
BP19
2020
2020 6 6
2020 7 5
2021
2022 4 8
2022 
2022
  

Таблица2:

 Report Year
2020
2020
2020
2020 6 6
2021
2022 4 8
2022 BP
2022
2020 6 6
2020
2020 6 6
2021
2022 4 8
2022
2022 
2022
  

Таблица3:

 Report Year
2020 5 7
2020 5 7
2020
2020
BP19
2020
2020 6 6
2020 7 5
2021
2022 4 8
2022 
2022
2020 6 6
2020 6 6
2020 7 5
2021
2022 4 8
2022 
2022 
  

Ответ №1:

Ваш псевдокод преобразуется в четыре update оператора:

 update table1
set [Report Year] = concat([Report Year], ' LTP')
where len([Report Year]) = 4;

update table2
set [Report Year] = concat([Report Year], ' LTP')
where len([Report Year]) = 4;

update table3 ...

update table4 ...
  

Логика состоит в том, чтобы идентифицировать записи, год отчета которых состоит всего из 4 символов, а затем добавить строку «LTP». Каждая из 4 таблиц независима от других, поэтому выполнение 4 запросов является правильным подходом.


Если вы хотите фильтровать по отчетным годам, которые содержат только цифры, а не состоят из 4 символов, используйте not like сопоставление с шаблоном и:

 where [Report Year] NOT LIKE '%[^0-9]%'
  

Это фразы типа: отчетный год не должен содержать никаких нецифровых символов.

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

1. я вижу! и является ли подсчет символов единственным способом сделать это? мне нравится думать о нескольких подходах, поэтому я хочу проверить, действительно ли эта ситуация с подсчетом символов — единственный способ добиться этого 🙂

2. @Cataster: для вашего варианта использования это выглядит как соответствующий подход. В противном случае вам нужно описать, какую логику вы хотите.

3. на самом деле, есть небольшая проблема. у нас есть другие годы, такие как BP19, BP20 и т. Д., И поскольку они имеют длину 4 символа, они тоже будут учитываться. Я не хочу их считать. я только хочу посчитать годы. есть ли способ добавить больше логики, чтобы избежать лет, начинающихся с BP, или вообще тех, которые начинаются с символа, а не числа?

4. @Cataster: я обновил свой ответ, чтобы фильтровать только по годам отчета со всеми цифрами.

5. кстати, что противоположно concat в sql? допустим, я хочу отменить эти изменения, будет ли это replace() ?

Ответ №2:

Чтобы убедиться [Report Year] , что столбец содержит только 4 цифры года без суффиксов, вы можете проверить, чтобы убедиться, что 4 символа начинаются либо с 1, либо с 2, а остальные 3 равны [0-9]. Что-то вроде этого

 update table1
set [Report Year] = concat([Report Year], ' LTP')
where [Report Year] like '[1-2][0-9][0-9][0-9]';

update table2
set [Report Year] = concat([Report Year], ' LTP')
where [Report Year] like '[1-2][0-9][0-9][0-9]';

update table3 ...

update table4 ...