如何在Presto的varchar字段数组中搜索文本?

时间:2019-07-30 02:13:34

标签: arrays presto

一个字段被定义为array(varchar)

'ABCD'说,我要搜索字段包含特定文本模式的记录。

如果我运行此SQL:

select * from data_table 
where top_results like '%ABCD%'

它抛出此错误:

  

查询失败(#20190730_021145_23663_dn9fj):第2:7行:   LIKE表达式必须计算为varchar(实际值:array(varchar)

检测某个字符串是否存在的正确语法是什么?

2 个答案:

答案 0 :(得分:2)

Use filter(array(T), function(T, boolean)) -> array(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

希望您有主意。

答案 1 :(得分:1)

将其转换为json字符串,然后搜索该字符串

### plot one matrix vs. another matrix reset session FILE1 = "TestMatrix1.dat" FILE2 = "TestMatrix2.dat" stats FILE1 nooutput ColMax = STATS_columns # get maximum number of columns set table $Dummy Mat1 = Mat2 = '' plot for [i=1:ColMax] FILE1 u (Mat1=Mat1.sprintf(" %g",column(i)),0) w table plot for [i=1:ColMax] FILE2 u (Mat2=Mat2.sprintf(" %g",column(i)),0) w table unset table set print $Data do for [i=1:words(Mat1)] { print sprintf("%s %s",word(Mat1,i),word(Mat2,i)) } set print plot $Data u 1:2 w p pt 7 ### end of file

json_format(cast(top_results as JSON))