在同一个sql查询中同时使用where、case和like

ukqbszuj  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(332)

我很难找到正确的查询来执行以下操作:假设我们以某种方式从用户处获取两列值的输入, datestamp 以及 brand (所发生的事情是looker ui将其提供给查询)。为了简单起见,假设我们的模式包含两个列,我只想把它们取回来,所以:

SELECT brand, datestamp
FROM my_table
WHERE

剩下的我不知道该怎么写。以下是我们想要的:
用户可以键入 yesterday , today , last x days 对某些人来说 x 或者像绳子一样的东西 20181001 并将正确的日期传递给查询。
用户可以指定 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 )

如果查询有效,则结果应该是具有 brand 以及 datestamp 等于用户想要的。所有的行都是相同的(我实际上想要一些其他的东西,但是如果 CASE 已解决)。
请为我写完整的查询。我不知道在哪里 WHERE 与…有关 CASE , WHEN , AND ,以及本例中存在的其他关键字。

mec1mxoz

mec1mxoz1#

在looker中,我认为这一切都可以很简单地通过使用模板过滤器而不是像现在这样的参数来完成。
基本上,模板过滤器会自动将所选条件应用于查询,因此不必使用当前的case语句显式说明所有可能的用户输入形式,只需

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

这一行可以替换所有的datestamp case语句--您还可以通过将brand filter添加到末尾来包含它,如:

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

那就应该编写所需的sql了!如果您为filter\u brand输入“foo”,为filter\u datestamp输入“forday”,则会显示:

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

让我知道,如果扫描或如果有什么是不合理的!另外,将来我会邀请你到我们的社区论坛discussion.looker.com发帖:)我们有很多lookerMaven,他们很乐意回答这样的问题。

icomxhvb

icomxhvb2#

这可能是您的问题:

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”

相关问题