1、split(string str, string regex)函数:
TDW官方文档上的解释:
函数说明:
Splits str around occurances that match用法示例:
SELECT split(‘ABCD:C:D:E’,’:’)[2] returns ‘D’.
那么,是否可以按照多个字符进行分割呢,答案是可以的。在指定多个分隔符的时候,需要用’|’符号隔开:
SELECT split('hello world,zhuoru',' |,')
返回的结果是一个数组:[[“hello”,”world”,”zhuoru”]]
2、array_contains(array arr, element)函数:
TDW官方文档上的解释:
函数说明:
Returns if the element is in the array, the element must hava same type as array用法示例:
SELECT array_CONTAINS(ARRAY(0,1),0) returns true
SELECT array_CONTAINS(split(‘0=1’,’=’),’0’) returns true
3、两个函数的实际应用:
在处理SDK日志的时候,日志中的other字段有的有leakscan属性,有的没有,leakscan和它的值之间以^B间隔,leakscan和其他属性之间以^B间隔。有leakscan并且其值为’-‘表示是正常访问(没有leakscan的情形全部认为是正常访问),如果是漏洞扫描访问,leakscan的值不为空且不为’-‘。最终要完成的任务是查询出正常访问的记录。我是这样写查询SQL的:
SELECT
*
FROM
mig_tdbank :: qqmap_openplatform_dsl_apikey_fht0
WHERE
tdbank_imp_date >= MACRO_DATA_DATE || '12'
AND tdbank_imp_date <= MACRO_DATA_DATE || '13'
AND SUBSTR(other, 8, 3) != '400'
AND (
array_CONTAINS(
split(
other
,'\\002'
)
,'leakscan' || '\\003' || '-'
) = TRUE
OR array_CONTAINS(
split(
other
,'\\002|\\003'
)
,'leakscan'
) = FALSE
) limit 1000
在where判断条件中,
array_CONTAINS(
split(
other
,'\\002'
)
,'leakscan' || '\\003' || '-'
) = TRUE
表示有leakscan并且其值为’-‘的情况。
array_CONTAINS(
split(
other
,'\\002|\\003'
)
,'leakscan'
) = FALSE
表示没有leakscan的情况。通过这两个条件,就过滤掉了漏洞扫描方式的访问。