Извлечение определенных слов из текстового значения

#postgresql #split

#postgresql #разделение

Вопрос:

У меня есть запрос и возвращаемое значение, которое выглядит следующим образом:

 select properties->>'text' as snippet from table where id = 31;

snippet
                                                                                                                                                                                                                                                                                                                                                                                   
-----------------------------------
 There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable.
(1 row)
 

Это возвращает, как я ожидаю, на основе моего запроса.

Есть ли способ, которым я могу нарезать возвращаемый текст, чтобы возвращать только слова из позиции 5 в позицию 8, например? Или, в качестве альтернативы, нарезать по позиции символа, которую я смогу использовать в качестве обходного пути?

Я пытался использовать:

 select properties->>'text'[0:13] as snippet from table where id = 31;
 

Который, я надеялся, вернет:
There are many
Но это не сработало.

Возможно ли это для фрагментации текстового поля jsonb?

Комментарии:

1. В «текстовом поле jsonb» нет ничего особенного. Результатом properties->>'text' simply уже является значение типа text , и вы можете использовать для этого известные функции обработки строк .

Ответ №1:

Чтобы «нарезать по позиции символа», вы можете просто использовать substr() функцию:

 select substr(properties->>'text', 1, 15) as snippet 
from the_table 
where id = 31;
 

Если вам действительно нужны «слова», вы можете разделить текст на массив, используя, например regexp_split_to_array . Как только у вас есть массив, вы можете использовать синтаксис slice:

 select (regexp_split_to_array(properties->>'text','s '))[5:8] as snippet 
from the_table 
where id = 31;
 

Это возвращает массив, если вы хотите его в виде строки, вы можете использовать array_to_string()

 select array_to_string((regexp_split_to_array(properties->>'text','s '))[5:8],' ') as snippet 
from the_table 
where id = 31;
 

Если вам это нужно часто, я бы превратил это в функцию:

 create function extract_words(p_input text, p_start int, p_end int)
  returns text
as
$
  select array_to_string((regexp_split_to_array(p_input,'s '))[p_start:p_end],' ');
$  
language sql
immutable;
 

Тогда запрос намного легче читать:

 select extract_words(properties->>'text', 5, 8) as snippet 
from the_table 
where id = 31;