字符串函数split、array_contains

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

 

array_contains 分析函数使用演示

-- ========================================================================================

-- 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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值