У меня есть таблица SQL, которая выглядит примерно так:
Date Object_ID Category Direction
0 2011-02-02 0H 1234 JKL/987 A N
1 2011-02-02 0H 4321 BNM/987 A N
2 2011-02-02 0H 5678+ JKL/987 A N
3 2011-02-02 0H 8765 BNM/987 A S
4 2011-02-02 0H 9021+ JKL/987 A S
5 2011-02-02 0H 1102+ JKL/987 A N
Я хочу иметь возможность добавить строковое значение в столбец «Направление» (либо «N», либо «S») в столбец «Object_ID» в определенной позиции, чтобы вывод оператора select возвращал это:
Date Object_ID Category Direction
0 2011-02-02 0H 1234 NJKL/987 A N
1 2011-02-02 0H 4321 NBNM/987 A N
2 2011-02-02 0H 5678+NJKL/987 A N
3 2011-02-02 0H 8765 SBNM/987 A S
4 2011-02-02 0H 9021+SJKL/987 A S
5 2011-02-02 0H 1102+NJKL/987 A N
Я знаю, что интервал нечетный, но важно, чтобы он сохранялся. Любая помощь будет оценена по достоинству.
Учитывая пример, где данные находятся ровно в 2 разных форматах на основе чего-то в 8-й позиции, вы можете использовать выражение case с concat().
with my_data as (
select '2011-02-02' as date, '0H 1234 JKL/987' as object_id, 'A' as category, 'N' as direction union all
select '2011-02-02', '0H 4321 BNM/987', 'A', 'N' union all
select '2011-02-02', '0H 5678+ JKL/987', 'A', 'N' union all
select '2011-02-02', '0H 8765 BNM/987', 'A', 'S' union all
select '2011-02-02', '0H 9021+ JKL/987', 'A', 'S' union all
select '2011-02-02', '0H 1102+ JKL/987', 'A', 'N')
select date, object_id as orig_obj_id,
case
when substring(object_id, 8, 1) = ' '
then concat(substring(object_id, 1, 8), direction, substring(object_id, 9, 8))
else concat(substring(object_id, 1, 8), direction, substring(object_id, 10, 7))
end as mod_obj_id,
category, direction
from my_data;
Вывод легче рассматривать как текст, а не как таблицу выше:
mod_obj_id
0H 1234 NJKL/987
0H 4321 NBNM/987
0H 5678+NJKL/987
0H 8765 SBNM/987
0H 9021+SJKL/987
0H 1102+NJKL/987
Похоже, он выводит «0H 1234 N JKL/987» вместо «0H 1234 NJKL/987» для идентификаторов без «+».
Нет, это не так. Посмотрите на код выше. Вывод был скопирован/вставлен. Если вы видите иначе, ваши данные отличаются от тех, которые вы указали в вопросе.
Вы правы, прошу прощения. Между 1234 и JKL/987 есть дополнительный пробел, который я не указал в исходном вопросе. Спасибо за помощь!
Если в ваших данных действительно есть 2 пробела для некоторых, вам нужно будет настроить этот код. Вы можете заменить два пробела одним как часть процесса, но на самом деле это зависит от ваших данных и желаемого результата.
Использование regexp_replace
:
select t.rnum, t.date, regexp_replace(t.object_id, '(?<=\d)\+*\s(?=[A-Z])',
case when regexp_substr(t.object_id, '(?<=\d)\+*\s(?=[A-Z])') = ' '
then ' '||t.direction else '+'||t.direction end),
t.category, t.direction
from tbl t
Если бы обратная сторона этой проблемы была проще (уже имея индикатор направления и избавляясь от него, а не добавляя его), я бы определенно принял эти решения.