Поле определяется как array(varchar)
в модеанлятическом режиме.
Я хочу найти записи с полем, содержащим определенный текстовый шаблон, говорит 'ABCD'
.
Если я запускаю этот SQL:
select * from data_table
where top_results like '%ABCD%'
Выдает эту ошибку:
Query failed (#20190730_021145_23663_dn9fj): line 2:7: Left side of LIKE expression must evaluate to a varchar (actual: array(varchar)
Каков правильный синтаксис для обнаружения наличия определенной строки?
Использовать фильтр (массив (T), функция (T, логическое значение)) -> массив (T)
он возвращает массив, содержащий элементы, для которых функция возвращает значение true. Используйте функцию кардинальности, чтобы проверить, не пуст ли массив:
SELECT cardinality(filter(ARRAY ['123ABCD456', 'DQF', 'ABCD', 'ABC'], x -> x like '%ABCD%'))>0 ;
Возвращает
true
Проверьте другое значение:
SELECT cardinality(filter(ARRAY ['123ABCD456', 'DQF', 'ABCD', 'ABC'], x -> x like '%XXX%'))>0 ;
Возвращает
false
Надеюсь, вы уловили идею.
Преобразуйте его в строку json, а затем найдите строку
json_format(cast(top_results as JSON))
select * from data_table
where json_format(cast(top_results as JSON)) like '%ABCD%'
Это примерно так же просто, как и получается, но отмечено.
Ответы, содержащие только код, не рекомендуются в Stack Overflow, поскольку они не объясняют, как это решает проблему. Пожалуйста, отредактируйте свой ответ, чтобы объяснить, что делает этот код и как он решает проблему, чтобы он был полезен для OP, а также для других пользователей с похожими проблемами.