SQL вставляет строку из одного столбца в другой в операторе выбора

У меня есть таблица 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

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

Если бы обратная сторона этой проблемы была проще (уже имея индикатор направления и избавляясь от него, а не добавляя его), я бы определенно принял эти решения.

slowmotionnovember 10.02.2023 16:02
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Учитывая пример, где данные находятся ровно в 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;
дата orig_obj_id mod_obj_id категория направление 2011-02-02 0H 1234 JKL/987 0H 1234 NJKL/987 А Н 2011-02-02 0H 4321 БНМ/987 0H 4321 НБНМ/987 А Н 2011-02-02 0H 5678+ JKL/987 0H 5678+NJKL/987 А Н 2011-02-02 0H 8765 БНМ/987 0H 8765 СБНМ/987 А С 2011-02-02 0H 9021+ JKL/987 0H 9021+SJKL/987 А С 2011-02-02 0H 1102+ JKL/987 0H 1102+NJKL/987 А Н

Вывод легче рассматривать как текст, а не как таблицу выше:

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» для идентификаторов без «+».

slowmotionnovember 10.02.2023 17:16

Нет, это не так. Посмотрите на код выше. Вывод был скопирован/вставлен. Если вы видите иначе, ваши данные отличаются от тех, которые вы указали в вопросе.

Isolated 10.02.2023 17:21

Вы правы, прошу прощения. Между 1234 и JKL/987 есть дополнительный пробел, который я не указал в исходном вопросе. Спасибо за помощь!

slowmotionnovember 10.02.2023 17:29

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

Isolated 10.02.2023 17:37

Использование 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

Смотрите скрипку.

Другие вопросы по теме