ИСПОЛЬЗУЯ SQL. извлекать числа запятыми, отделенными от строки 'HEADER | N1000 | E1001 | N1002 | E1003 | N1004 | N1005' - PullRequest
0 голосов
/ 14 октября 2019
'HEADER|N1000|E1001|N1002|E1003|N1004|N1005'    
   'HEADER|N156|E1|N7|E122|N4|E5'   
   'HEADER|E0|E1|E2|E3|E4|E5'   
   'HEADER|N0|N1|N2|N3|N4|N5'
   'HEADER|N125' 

Как извлечь числа в формате через запятую из этой строки S?

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

1000,1001,1002,1003,1004,1005

Как извлечь числа с N или E в качестве суффикса / префикса т.е.

N1000 

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

1000,1002,1004,1005

ниже регулярного выражения не возвращает требуемый результат. Но я хочу что-то вроде этого

select REGEXP_REPLACE(REGEXP_REPLACE('HEADER|N1000|E1001|N1002|E1003|N1004|N1005', '.*?(\d+)', '\1,'), ',?\.*$', '') from dual

проблема здесь в том, что когда мне нужны числа с E ИЛИ N

select REGEXP_REPLACE(REGEXP_REPLACE('HEADER|N1000|E1001|N1002|E1003|N1004|N1005', '.*?N(\d+)', '\1,'), ',?\.*$', '') from dual
select REGEXP_REPLACE(REGEXP_REPLACE('HEADER|N1000|E1001|N1002|E1003|N1004|N1005', '.*?E(\d+)', '\1,'), ',?\.*$', '') from dual

, они дают хорошие результаты для этого scenerio

но когда я ввожу 'HEADER | N1000 | E1001', он дает неправильный ответ, plzzz проверьте и исправьте его

Ответы [ 3 ]

0 голосов
/ 14 октября 2019

Я не знаю, какую СУБД вы используете, но вот один из способов сделать это в Postgres:

WITH cte AS (
  SELECT CAST('HEADER|N1000|E1001|N1002|E1003|N1004|N1005|' AS VARCHAR(1000)) AS myValue
)
SELECT SUBSTRING(MyVal FROM 2)
FROM (
  SELECT REGEXP_SPLIT_TO_TABLE(myValue,'\|') MyVal
  FROM cte
) src
WHERE SUBSTRING(MyVal FROM 1 FOR 1) = 'N'
;

SQL Fiddle

0 голосов
/ 14 октября 2019

Насколько я понял вопрос, вы хотите извлечь из строки подстроки, начинающиеся с N, вы можете попробовать выполнить следующее (а затем при необходимости вы можете объединить вывод, разделенный запятыми)

select REPLACE(value, 'N', '') from STRING_SPLIT('HEADER|N1000|E1001|N1002|E1003|N1004|N1005|', '|') where value like 'N%'

Выход:

1000 1002 1004 1005

0 голосов
/ 14 октября 2019

Обновление

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

WITH cte AS (
  SELECT DISTINCT data, level AS l, REGEXP_SUBSTR(data, '[NE]\d+', 1, level) AS num FROM test
  CONNECT BY REGEXP_SUBSTR(data, '[NE]\d+', 1, level) IS NOT NULL
)
SELECT data, LISTAGG(SUBSTR(num, 2), ',') WITHIN GROUP (ORDER BY l) AS "All numbers"
FROM cte
GROUP BY data

Вывод (для новых образцов данных):

DATA                                        All numbers
HEADER|E0|E1|E2|E3|E4|E5                    0,1,2,3,4,5
HEADER|N0|N1|N2|N3|N4|N5                    0,1,2,3,4,5
HEADER|N1000|E1001|N1002|E1003|N1004|N1005  1000,1001,1002,1003,1004,1005
HEADER|N125                                 125
HEADER|N156|E1|N7|E122|N4|E5                156,1,7,122,4,5

Чтобы выбрать только числа, начинающиеся с E, мы модифицируем запросдля замены [EN] в выражениях REGEXP_SUBSTR просто E, т. е.

  SELECT DISTINCT data, level AS l, REGEXP_SUBSTR(data, 'E\d+', 1, level) AS num FROM test
  CONNECT BY REGEXP_SUBSTR(data, 'E\d+', 1, level) IS NOT NULL

Вывод:

DATA                                        E-numbers
HEADER|E0|E1|E2|E3|E4|E5                    0,1,2,3,4,5
HEADER|N0|N1|N2|N3|N4|N5    
HEADER|N1000|E1001|N1002|E1003|N1004|N1005  1001,1003
HEADER|N125     
HEADER|N156|E1|N7|E122|N4|E5                1,122,5

Аналогичное изменение можно сделать, чтобы извлечь числа, начинающиеся с N.

Демонстрация на dbfiddle

Оригинальный ответ

Одним из способов достижения желаемого результата является замена строкисимволов, ведущих к числу с этим номером и запятой, а затем заменить любые символы от последнего ,| до конца строки из результата:

SELECT REGEXP_REPLACE(REGEXP_REPLACE('HEADER|N1000|E1001|N1002|E1003|N1004|N1005|', '.*?(\d+)', '\1,'), ',?\|.*$', '') FROM dual

Вывод:

1000,1001,1002,1003,1004,1005

Чтобы выводить только числа, начинающиеся с N, мы добавляем это к строке префикса перед группой захвата:

SELECT REGEXP_REPLACE(REGEXP_REPLACE('HEADER|N1000|E1001|N1002|E1003|N1004|N1005|', '.*?N(\d+)', '\1,'), ',?\|.*$', '') FROM dual

Вывод:

1000,1002,1004,1005

Для вывода толькочисла, начинающиеся с E, добавляем это к строке префикса перед группой захвата:

SELECT REGEXP_REPLACE(REGEXP_REPLACE('HEADER|N1000|E1001|N1002|E1003|N1004|N1005|', '.*?E(\d+)', '\1,'), ',?\|.*$', '') FROM dual

Выход:

1001,1003

Демонстрация на dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...