#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 ...