【问题标题】:How do I get BigQuery to filter on repeated STRING field with IN and NOT IN?如何让 BigQuery 过滤带有 IN 和 NOT IN 的重复 STRING 字段?
【发布时间】:2021-04-20 19:02:44
【问题描述】:

我正在尝试使用重复的字符串字段过滤 BigQuery 表中的行。 我想根据至少包含一个预定义列表中的一个值但不包含来自第二个预定义列表的任何值的行进行过滤。

这是我的查询:

   SELECT em.asin, em.category 
    FROM 
        `my_proj.amazon_data.electronics_meta` as em,
        UNNEST(em.category) as sub_cat
    WHERE sub_cat IN ('Television & Video', 'Televisions', 'Television & Video')
    AND sub_cat NOT IN (
        'DVD Players & Recorders',
        'Projection Screens',
        'VCRs',
        'Blu-ray Players',
        'Blu-ray Players & Recorders'
    )

这是我得到的结果:

我希望第一行不会出现,因为它在 category 字段中包含“VCR”。

我也试过

AND LOWER(TRIM(sub_cat)) NOT IN (
        'dvd players & recorders',
        'projection screens',
        'vcrs',
        'blu-ray players',
        'blu-ray players & recorders'
    )

    AND NOT (sub_cat IN (
        'DVD Players & Recorders',
        'Projection Screens',
        'VCRs',
        'VCRs',
        'Blu-ray Players',
        'Blu-ray Players & Recorders'
    ))

但这不会改变结果。

其他信息: 这是表的架构:

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    使用EXISTS:

    SELECT em.asin, em.category 
    FROM 
      `my_proj.amazon_data.electronics_meta` as em
    WHERE 
      exists ( select *
               from unnest(category) as sub_cat
               where sub_cat IN ('Television & Video', 'Televisions', 'Television & Video')
             )
      and not exists ( select *
                       from unnest(category) as sub_cat
                       where sub_cat IN (
                         'DVD Players & Recorders',
                         'Projection Screens',
                         'VCRs',
                         'Blu-ray Players',
                         'Blu-ray Players & Recorders'
                       )
                     )
    

    【讨论】:

    • 谢谢!我必须删除 where sub_cat NOT IN ( 中的最后一个 NOT 并且它有效 - 如果您可以进行编辑,我可以标记这解决了我的问题。
    • 哦,抱歉,已修复。
    【解决方案2】:

    您也可以在 FROM 子句中使用聚合来执行此操作:

    SELECT em.asin, em.category 
    FROM `my_proj.amazon_data.electronics_meta` em CROSS JOIN
         (SELECT COUNTIF(sub_cat IN ('Television & Video', 'Televisions', 'Television & Video')) as cnt_required,
                 COUNTIF( 'DVD Players & Recorders', 'Projection Screens', 'VCRs', 'Blu-ray Players', 'Blu-ray Players & Recorders'
                        ) as cnt_not_allowed
          FROM unnest(category) cat
         ) c
    WHERE c.cnt_required > 0 AND c.cnt_not_allowed = 0;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-29
      • 2020-12-24
      相关资源
      最近更新 更多