在同一SQL查询中一起使用WHERE,CASE,AND,LIKE

时间:2018-10-12 02:09:13

标签: mysql sql looker

我很难提出执行以下操作的正确查询:假设我们以某种方式从用户那里输入了两列datestampbrand的值(结果是Looker UI将其提供给查询)。为简单起见,假设我们的架构同时包含两个列,而我只想将它们取回,所以:

SELECT brand, datestamp
FROM my_table
WHERE

我不确定该如何写其余的内容。这是需要的:

  • 用户可以输入yesterday或诸如today之类的字符串来输入last x daysx20181001,然后输入正确的日期传递给查询。

  • 用户可以指定brand应该等于什么,并将其传递给查询。

    ( CASE
        WHEN position(' TO ' IN UPPER({% parameter filter_datestamp %})) > 0 THEN
                datestamp >= SUBSTR({% parameter filter_datestamp %}, 0, strpos(UPPER({% parameter filter_datestamp %}), ' TO ') - 1) AND
                datestamp <= SUBSTR({% parameter filter_datestamp %}, strpos(UPPER({% parameter filter_datestamp %}), ' TO ')  + 4)
                AND
                brand LIKE {% parameter filter_brand %}
    
        WHEN filter_datestamp = 'today' THEN datestamp = date_format(CURRENT_DATE,'yyyyMMdd')
        AND brand LIKE {% parameter filter_brand %}
    
    
        WHEN datestamp = 'yesterday' THEN datestamp = date_format(DATE_ADD('day', -1, CURRENT_DATE),'%Y%m%d')
        AND brand LIKE {% parameter filter_brand %}
    
        WHEN datestamp LIKE 'last % days' THEN datestamp >= date_format(DATE_ADD('day', -CAST(split({% parameter filter_datestamp %}, ' ')[2] AS INT), CURRENT_DATE),'%Y%m%d')
        AND brand LIKE {% parameter filter_brand %}
    
        ELSE datestamp LIKE {% parameter filter_datestamp %}
        AND brand LIKE {% parameter filter_brand %}
    
      END )
    

如果查询有效,则结果应为branddatestamp等于用户想要的行数。所有行都是相同的(我实际上想要其他东西,但是认为如果解决CASE,我可以做到这一点。)

请为我写完整的查询。我不确定WHERE在这种情况下相对于CASEWHENAND和其他关键字的位置。

2 个答案:

答案 0 :(得分:2)

在Looker中,我认为只需使用documentation而不是像现在一样使用参数就可以轻松完成所有操作。

基本上,模板化过滤器会自动将选择的条件应用于查询,因此您不必拥有当前拥有的CASE语句就显式地考虑所有可能形式的用户输入,

{% condition filter_datestamp %} datestamp {% endcondition %}

该行可以替换所有datestamp案例语句-您还可以通过将其添加到末尾来包括品牌过滤器,例如:

 {% condition filter_datestamp %} datestamp {% endcondition %} 
 AND brand LIKE {% parameter filter_brand %}

那应该写出所需的SQL!如果您为filter_brand输入“ foo”,为filter_datestamp输入“ yesterday”,则将输入:

SELECT brand, datestamp
FROM my_table
WHERE ((( datestamp ) >= ((DATE_ADD(CURDATE(),INTERVAL -1 day))) AND ( datestamp ) < ((DATE_ADD(DATE_ADD(CURDATE(),INTERVAL -1 day),INTERVAL 1 day)))))
 AND brand LIKE 'foo'

将其作为派生表的完整LookML(我想您正在尝试做的事情)看起来像

view: test {
  derived_table: {
    sql:
    SELECT brand, datestamp
    FROM my_table
    WHERE {% condition filter_datestamp %} datestamp {% endcondition %}
     AND brand LIKE {% parameter filter_brand %};;
  }


  filter: filter_datestamp {
    type: date
  }

  filter: filter_brand {
    type: string
  }

  dimension: brand {
    type: string
    sql: ${TABLE}.brand ;;
  }
  dimension: datestamp {
    type: date
    sql: ${TABLE}.datestamp ;;
  }
}

请让我知道该扫描是否正常,或者是否有没有任何意义!另外,将来我会邀请您在templated filters的社区论坛上发表文章:)我们那里有很多Looker专家,他们乐意回答这样的问题。

答案 1 :(得分:-1)

这可能是您的查询

SELECT brand, datestamp   FROM my_table
 WHERE (DATE (datestamp) = DATE (NOW ())
     OR DATE (datestamp) >= DATE_SUB (DATE (NOW ()), INTERVAL 'x' DAY) DATE(NOW()))
       AND brand = '<>';

但是为此,您每次必须输入x。 今天通过0 昨天通过1 对于最后的“ x”传递“ x”