Mysql 在同一SQL查询中同时使用WHERE、CASE和LIKE

Mysql 在同一SQL查询中同时使用WHERE、CASE和LIKE,mysql,sql,looker,Mysql,Sql,Looker,我很难找到正确的查询来执行以下操作:假设我们以某种方式从用户处获取两列值的输入,即datestamp和brand。发生的是UI将其提供给查询。为了简单起见,假设我们的模式包含两个列,我只想将它们取回,因此: SELECT brand, datestamp FROM my_table WHERE 剩下的我不知道该怎么写。以下是我们想要的: 用户可以为某些x或类似20181001的字符串键入昨天、今天、最后x天,并将正确的日期传递给查询 ( CASE WHEN position(' TO

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

SELECT brand, datestamp
FROM my_table
WHERE
剩下的我不知道该怎么写。以下是我们想要的:

用户可以为某些x或类似20181001的字符串键入昨天、今天、最后x天,并将正确的日期传递给查询

( 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 )
用户可以指定应该等于哪个品牌,并将其传递给查询

( 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 )
如果查询有效,结果应该是许多行,其品牌和日期戳等于用户想要的。所有的行都是相同的,我实际上想要一些其他的东西,但我想如果这个问题得到解决,我可以这样做


请为我写完整的查询。我不确定本例中的CASE、WHEN和其他关键字的位置。

这可能是您的查询:

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
对于Looker中的最后一个“x”过程,即“x”

,我认为这一切都可以非常简单地通过使用而不是像现在这样的参数来完成

基本上,模板化过滤器会自动将所选条件应用于查询,因此不必使用当前的CASE语句明确说明所有可能的用户输入形式,只需

{% condition filter_datestamp %} datestamp {% endcondition %}
这一行可以替换所有的邮戳案例声明-您也可以通过将其添加到末尾来包括品牌过滤器,如:

 {% condition filter_datestamp %} datestamp {% endcondition %} 
 AND brand LIKE {% parameter filter_brand %}
这应该可以编写所需的SQL!如果您为filter_品牌输入foo,为filter_邮戳输入datestamp,它将写入:

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'

让我知道,如果扫描或如果有什么是没有意义的!另外,将来我会邀请你在我们的社区论坛上发表文章:我们那里有很多长相专家,他们很乐意回答这样的问题。

在这种情况下,谁给MySQL打电话?我认为MySQL不应该将昨天转换为日期,事实上,日期本身是您的查询真正应该接受的唯一输入参数。因此,您的应用程序语言,如PHP、Java等,可能会涉及到这里。我想Tim是对的。这不是SQL的用途。它能做到吗?可能但是性能会很差…在Java、C、Visual Basic应用程序中执行此逻辑要容易得多。然后将from_date和to_date参数传递给查询,只需测试date>=?日期呢?。确保第二个参数是第二天。这使得包含时间接近午夜的日期变得更容易。date列应该有一个日期类型,而不是文本类型。对于那些想知道的人来说,某些x或类似20181001位的字符串的昨天、今天、最后x天是对looker的筛选表达式的引用,它允许将此类语句转换为SQL语句。