Sql regexp_substr ПОЛУЧИТЬ СТРОКУ ДО И ПОСЛЕ ДЕФА

У меня есть числа и их тип, хранящиеся в одном столбце в Oracle DB. Используя sql, я хочу разделить их и вернуться к пользователю.

Например ABC-1234 ABC - это тип 1234 - это число

пока что пробовал это. Есть ли ABC или BN или XY или GF, я хочу вернуть null

  SELECT 'ABC-1234' TET_NUMBER FROM DUAL
  UNION ALL
  SELECT 'XY - 87686876' TET_NUMBER FROM DUAL
  UNION ALL  
  SELECT ' BN-345345' TET_NUMBER FROM DUAL
  UNION ALL   
    SELECT ' GF - 16666788789789' TET_NUMBER FROM DUAL
  UNION ALL   
    SELECT '987654' TET_NUMBER FROM DUAL

SELECT regexp_substr(TET_NUMBER, '[^-]+', 1, 1) AS PARTBEFORE- 

SELECT regexp_substr(TET_NUMBER, '[^-]+', 1, 1) AS PARTAFTER-

ожидаемый результат

ABC 1234
XY  87686876
BN  345345
GF  16666788789789
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
663
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вот и все: первая часть выбирает «слово» (\ w), а вторая часть выбирает набор «цифр» (\ d). Предложение WHERE позволяет избежать строк, отличных от альфа.

SQL> with test as
  2  (SELECT 'ABC-1234' TET_NUMBER FROM DUAL
  3   UNION ALL
  4   SELECT 'XY - 87686876' TET_NUMBER FROM DUAL
  5   UNION ALL
  6   SELECT ' BN-345345' TET_NUMBER FROM DUAL
  7   UNION ALL
  8   SELECT ' GF - 16666788789789' TET_NUMBER FROM DUAL
  9   UNION ALL
 10   SELECT '987654' TET_NUMBER FROM DUAL
 11  )
 12  select tet_number,
 13    regexp_substr(tet_number, '\w+') first_part,
 14    regexp_substr(tet_number, '\d+') second_part
 15  from test
 16  where regexp_like(tet_number, '[[:alpha:]]+')
 17  ;

TET_NUMBER           FIRST_PART      SECOND_PART
-------------------- --------------- ---------------
ABC-1234             ABC             1234
XY - 87686876        XY              87686876
 BN-345345           BN              345345
 GF - 16666788789789 GF              16666788789789

SQL>

[Обновлено: что, если строка ввода изменится, как указано в комментарии OP]

Ничего особенного; вы бы скорректировали регулярное выражение, например

 <snip>
 14  select
 15    tet_number,
 16    regexp_substr(tet_number, '\w+', 1, 1) first_part,
 17    regexp_substr(tet_number, '\w+', 1, 2) second_part
 18  from test
 19  where regexp_like(tet_number, '[[:alpha:]]+');

TET_NUMBER           FIRST_PART      SECOND_PART
-------------------- --------------- ---------------
ABC-1234             ABC             1234
XY - 87686876        XY              87686876
 BN-345345           BN              345345
 GF - 16666788789789 GF              16666788789789
ABC-1W234            ABC             1W234

Спасибо, а если у меня будет персонаж из второй части? ВЫБЕРИТЕ 'ABC-1W234' TET_NUMBER ИЗ ДВОЙНОГО

My Shopping 10.08.2018 16:01

Вы бы скорректировали регулярное выражение. Отредактировал свой ответ, посмотрите.

Littlefoot 10.08.2018 23:35

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