Во-первых, стоит отметить, что данные в таком формате не могут использовать все преимущества Redshift.Amazon Redshift - это столбчатая база данных, которая может обеспечить удивительную производительность, когда данные хранятся в соответствующих столбцах.Тем не менее, выбор конкретного текста из текстового поля всегда будет работать плохо.
Поэтому мой главный совет - предварительно обработать данные в обычные строки и столбцы , чтобы Redshift мог предоставить вамлучшие возможности.
Однако, чтобы ответить на ваш вопрос, я бы порекомендовал сделать Скалярную пользовательскую функцию :
CREATE FUNCTION f_extract_curly (s TEXT, key TEXT)
RETURNS TEXT
STABLE
AS $$
# List of items in {brackets}
items = s[1:-1].split('}{')
# Dictionary of Key|Value from items
entries = {i.split('|')[0]: i.split('|')[1] for i in items}
# Return desired value
return entries.get(key, None)
$$ LANGUAGE plpythonu;
Я загрузил данные примера:
CREATE TABLE foo (
description TEXT
);
INSERT INTO foo values('{Managed By|xBoss}{xBoss xBoss Number|X0910505569}{Time Requested|2009-04-15 20:47:11.0}{Time Arrived|2009-04-15 21:46:11.0};');
INSERT INTO foo values('{Managed By|Modern Management}{xBoss Number|}{Time Requested|2009-04-16 14:01:29.0}{Time Arrived|2009-04-16 14:44:11.0};');
INSERT INTO foo values('{Managed By|xBoss}{xBoss Number|X091480092}{Time Requested|2009-05-28 08:58:41.0}{Time Arrived|};{Managed By|Jims Allocation}{xBoss xBoss Number|}{Time Requested|}{Time Arrived|};');
Затем я проверил это с помощью:
SELECT
f_extract_curly(description, 'Managed By'),
f_extract_curly(description, 'Time Requested')
FROM foo
и получил результат:
xBoss 2009-04-15 20:47:11.0
Modern Management 2009-04-16 14:01:29.0
xBoss
Он не знает, как обрабатывать строки с одинаковымиполе указывается дважды (с точкой с запятой).Вы не предоставили мне достаточно примеров строк ввода и вывода, чтобы я мог понять, что вам нужно в таких ситуациях, но вы можете настроить код под свои требования.