Преобразовать строку в массив и проверить размер в Vertica - PullRequest
0 голосов
/ 03 марта 2019

Мне нужно выполнить SQL-запрос, который преобразует столбец String в массив и затем проверяет размер этого массива

Мне удалось это легко сделать с помощью postgresql: например,

select
cardinality(string_to_array('a$b','$')),
cardinality(string_to_array('a$b$','$')),
cardinality(string_to_array('a$b$$$$$','$')),

Но по какой-то причине попытаться преобразовать String в vertica в массив не так просто, увидел следующие ссылки:

https://www.vertica.com/blog/vertica-quick-tip-dynamically-split-string/ https://forum.vertica.com/discussion/239031/how-to-create-an-array-in-vertica

И многое другое, что неиз них помогло.

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

select  REGEXP_COUNT('a$b$$$$$','$')

Но я получаю неправильное значение - 1.

Как я могу преобразовать строку в массив на Vertica и получаетего длина?

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Я не смог преобразовать в массив - но я не могу получить длину значений. Что я делаю, так это конвертирую в строки счетчик использования - это не самая лучшая производительность, но с этим способом я могу также манипулироватькак фильтрация каждого значения между разделителями - и мне не нужно использовать [] для таких символов, как $

select (select count(1)   
        from (select StringTokenizerDelim('a$b$c','$') over ()) t)  

Return 3

0 голосов
/ 05 марта 2019

Вы можете создать скалярную функцию UDx (UDSF) в Java, C ++, R или Python.На входе будет строка, а на выходе будет целое число.https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/ExtendingVertica/UDx/ScalarFunctions/ScalarFunctions.htm

Это позволит вам использовать логику массива для конкретного языка в передаваемых строках. Например, в python вы можете включить эту логику:

input_list = input.split("$")
filtered_input_list = list(filter(None, input_list))
list_count = len(filtered_input_list)

Эти примеры являются хорошимиотправная точка для написания UDx для Vertica.https://github.com/vertica/UDx-Examples

0 голосов
/ 03 марта 2019

$ имеет особое значение в регулярном выражении.Он представляет конец строки.

Попробуйте экранировать его:

select REGEXP_COUNT('a$b$$$$$', '[$]')
...