Vertica SQL - получить значение c в столбце, - PullRequest
0 голосов
/ 18 апреля 2020

начинающий здесь с Вертикали SQL.

В нашей базе данных есть столбец с именем TEXT. В нем есть куча информации, которую я хотел бы проанализировать, что я делаю вручную.

Пример ниже

TEXT
Age = 51, Country = USA, State = NY, ..... 

Как мне выполнить подзапрос и найти заданную строку c и получить это значение? Значение,

Выбрать текст, если он содержит «Возраст» и соответствующее значение?

Был бы очень признателен за помощь, проанализировал его вручную в Excel ..

Спасибо !

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Если вам это нужно часто, напишите функцию. А затем используйте его для создания реальной таблицы, где «ключ» становится именем столбца, а также строка цифра c, например «51», становится целым, а не VARCHAR ...

Вот определение функции и запуск теста ...

CREATE OR REPLACE FUNCTION val (
  s VARCHAR
, k VARCHAR
)
RETURN VARCHAR AS 
BEGIN
  RETURN REGEXP_SUBSTR(s,k||'\s*=\s*([^,]+),?',1,1,'i',1);
END;


WITH input(s,k) AS (
            SELECT 'Age = 51, Country = USA, State = NY','Age'
  UNION ALL SELECT 'Age = 51, Country = USA, State = NY','Country'
  UNION ALL SELECT 'Age = 51, Country = USA, State = NY','State'
)
SELECT
  *
, val(s,k)
FROM input;
                  s                  |    k    | val 
-------------------------------------+---------+-----
 Age = 51, Country = USA, State = NY | Age     | 51
 Age = 51, Country = USA, State = NY | Country | USA
 Age = 51, Country = USA, State = NY | State   | NY


0 голосов
/ 19 апреля 2020

Как прокомментировал Гордон Линофф, вы должны действительно исправить свой дизайн и хранить каждое значение в отдельном столбце, а не иметь строку в одном столбце, который вам нужно проанализировать.

Между тем, один опция заключается в использовании функции регулярного выражения regexp_substr():

 regexp_substr(text, 'Age\s*=\s*(\S+)', 1, 1, '', 1)

'Age\s*=\s*(\S+)' означает:

  • литеральная строка 'Age'
  • От 0 до n пробелов
  • буквально '='
  • От 0 до n пробелов
  • максимально возможное количество символов, кроме пробела (не менее 1)

Скобки охватывают последнюю часть, которую затем можно вернуть, используя последний аргумент функции (1 означает, что должна быть возвращена первая захваченная группа).

...