【问题标题】:Is there a way to check if any items in a string array are in a string in Snowflake/Redshift?有没有办法检查字符串数组中的任何项目是否在 Snowflake/Redshift 的字符串中?
【发布时间】:2020-06-11 01:23:04
【问题描述】:

我正在寻找一种方法来检查字符串是否包含另一个字段中的任何单词,该字段是包含项目列表的单个字符串。像这样的...

id              items (STRING)
1            burger;hotdog

我有第二个数据集,可能看起来像...

transaction_id       description           amount
     10              cheeseburger            10

现在,如果描述与第一个表中的任何项目匹配,我需要获取金额,在这种情况下,它与字符串 burger 匹配,但是,我似乎无法正确获取 SQL,因为如果我要使用LIKE ANY 在 Snowflake 中,我需要传入两个单独的字符串 **('%burger%",'%hotdog%') - 在这种情况下,我无法进行显式调用因为第一个表中的每个 id/item 排列可能不同。当我尝试使用 Redshift 时

CASE WHEN lower(t.description) SIMILAR TO '%(' || replace(items,';','|') || ')%' then amount END

我收到以下错误:Redshift 表不支持指定的类型或函数(每条 INFO 消息一个)。

提前致谢!

【问题讨论】:

    标签: sql amazon-redshift snowflake-cloud-data-platform


    【解决方案1】:

    如果你想要一个雪花的答案:

    WITH keys AS (
        SELECT * FROM VALUES (1,'burger;hotdog') a(id,items)
    ), data AS (
        SELECT * FROM VALUES (10,'cheeseburger',10) b(transaction_id, description, amount)
    ), seq_keys AS (
        SELECT s.seq_id, f.value as key
        FROM (
            SELECT seq8() as seq_id, k.*
            FROM keys AS k
        ) AS s
        ,lateral flatten(input=>split(s.items,';')) F
    )
    SELECT d.*, sk.*
    FORM data d 
    JOIN seq_keys sk ON d.description ILIKE '%'||sk.key||'%'
    

    给予:

    TRANSACTION_ID  DESCRIPTION AMOUNT  SEQ_ID  KEY
    10  cheeseburger    10  0   "burger"
    

    您在 SEQ_ID 上是不同的,那么如果有多个匹配的键,您可以进行重复数据删除。我也倾向于在“数据表”中添加一个 ID。

    【讨论】:

    • 谢谢!这是完美的。使用 seq8() 仅用于重复数据删除有什么意义?
    • 是的,只是为了去重复,以便在分解它们之前找到匹配的“键”的数量。 Aka 不确定您需要如何处理此步骤后的结果。
    猜你喜欢
    • 2018-04-06
    • 2016-03-04
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多