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',' |,')1
返回的结果是一个数组:[[“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 1000123456789101112131415161718192021222324
在where判断条件中,
array_CONTAINS(
split(
other
,'\\002'
)
,'leakscan' || '\\003' || '-'
) = TRUE1234567
表示有leakscan并且其值为’-‘的情况。
array_CONTAINS(
split(
other
,'\\002|\\003'
)
,'leakscan'
) = FALSE
-- ========================================================================================
-- Purpose : array_contains 分析函数使用演示
------------------------------------ Change Log -------------------------------------------
-- Date Generated Updated By Description
-------------------------------------------------------------------------------------------
-- 2018-12-26 shujuxiong Initial Version
-- ========================================================================================
-- status_code枚举:1生效中 2冻结中 3失效中
select
user_id
,
count
(*)
as
card_number
-- 使用过的卡数
-- 只要任意一张卡有效即判定为VIP有效
,
case
when
array_contains(collect_set(status_code),
cast
(1
as
smallint
))
then
1
else
0
end
effective_flag
-- 卡有效标识
from
edw_users.dwd_edw_user_vipcard_df
-- 用户VIP卡购买使用全量表
where
dt =
'${dt}'
and
user_id > 0
and
deleted_flag =
'N'
group
by
user_id
;
原文:https://blog.csdn.net/liluotuo/article/details/43986013