【问题标题】:Google Sheets Query to return conditional Select?谷歌表格查询返回条件选择?
【发布时间】:2018-11-17 17:18:25
【问题描述】:

这里是完整的 SQL 业余爱好者。我有一个谷歌表,用户在其中输入格式为A[B or C] 的数据。所以使用这张表:

+-------+-------------+-------------+
| A     | B           | C           |
+-------+-------------+-------------+
| Apple | Red         | Crunchy     |
| Pear  |             | Crunchy     |
| Lemon |             |             |
+-------+-------------+-------------+

..我希望得到以下回报:

输入apple[red] 返回Apple Red

输入apple[crunchy] 返回Apple Crunchy

因此,除了 A 之外,基本上只返回 BC,具体取决于匹配发生在哪一列。实际上,crunchy 可以在任一列中 BC(但不是两者)。

到目前为止我有这个:

Select A, B, C where UPPER(H) matches '.*(?:^|,|,\s)"&REGEXEXTRACT(Q3,"^[^\[]+")&"(?:,\s|,|$).*' and B matches '"&REGEXEXTRACT(Q3, "\[(\w+)\]")&"' limit 1

但显然它没有按我的意愿工作,并且匹配返回 A B C 预期。

所以我想我的问题是您能否根据匹配有条件地返回列,以及在BC 匹配中使用OR 的最佳方式是什么?我尝试只输入and B or C matches,但失败了。我想你可以写出像B matches '"&REGEXEXTRACT(Q3, "\[(\w+)\]")&"' or C matches '"&REGEXEXTRACT(Q3, "\[(\w+)\]")&"' 这样的另一行,但它开始变得相当复杂,我猜有一个更简单的方法。

我想知道的另一件事是,如果用户输入apple,则是否有一种方法可以使BC 都成为可选的,因此仅返回Apple。我打算用一张 if 和 2 个查询来执行此操作,具体取决于 [] 是否存在,但我想知道它是否可以在一个 SQL 语句中使用。

感谢您的帮助。这么多挠头不会留下任何头发!

【问题讨论】:

    标签: sql google-sheets google-query-language


    【解决方案1】:

    好的,那么您将如何在 Google 表格中执行此操作? Google Sheets Query 有两个问题让它有点尴尬

    (1) 没有工会

    (2) 你不能返回一个空集——它会给你一个错误信息。

    两个单独的查询如下所示:

    =ArrayFormula(query({A:B,A:A&"["&B:B&"]"},"select Col1,Col2 where Col3='"&F1&"'"))
    

    =ArrayFormula(query({A:A,C:C,A:A&"["&C:C&"]"},"select Col1,Col2 where Col3='"&H1&"'"))
    

    其中 F1 和 H1 包含所需的输入。

    要将它们组合起来,您必须像这样输入 IFERROR 语句:

    =ArrayFormula(iferror(query({A:B,A:A&"["&B:B&"]"},"select Col1,Col2 where Col3='"&J1&"'"),iferror(query({A:A,C:C,A:A&"["&C:C&"]"},"select Col1,Col2 where Col3='"&H1&"'"),"")))
    

    这是假设只有一个查询提供了结果。

    【讨论】:

    • 谢谢汤姆。我想我会先不经询问就试一试。我觉得这是一个彻头彻尾的噩梦!如果失败了,我会试一试,但我需要坐下来弄清楚发生了什么
    • 我认为您是对的,Google 查询似乎对您的问题没有多大帮助。
    【解决方案2】:

    如果我理解你的问题,为什么不直接:

    create table mytable (A text, B text, C text);
    insert into mytable values ('Apple', 'Red', 'Crunchy'), ('Pear', null, 'Crunchy'), ('Lemon', null, null);
    select * from mytable;
    
    -- Example 1: input = apple[red]
    select a, b from mytable where upper(a || '[' || b || ']') = upper('apple[red]')
    union all 
      select a, c from mytable where upper(a || '[' || c || ']') = upper('apple[red]');
    
    -- Example 2: Same query different input = apple[crunchy]
    select a, b from mytable where upper(a || '[' || b || ']') = upper('apple[crunchy]')
    union all 
      select a, c from mytable where upper(a || '[' || c || ']') = upper('apple[crunchy]'); 
    

    您甚至可以在 upper(a || '[' || b || ']') 和 upper(a || '[' || c || ']') 上创建函数索引

    【讨论】:

    • 谢谢@mnesarco。唯一的问题是我正在使用谷歌表格,我不确定如何实施您的解决方案,因为我认为它不完全支持 SQL。不过,我会给它一个狂欢。
    猜你喜欢
    • 2021-12-06
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多