if-in-where-mysql查询

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

我有这张table。

在mysql中,如果 key 列没有 custom 行和if key 列有 custom 行-> value 列= yes .
这是我的查询,但不起作用:

where `value` = if(`key` = 'custom', 'yes', '')
ecbunoof

ecbunoof1#

这个查询的规范并不清楚,因为它有几种不同的解释。
我想问题是如何返回一个特定的结果,而不是使用 IF()WHERE 条款(下面的sql都不使用 IF() 函数 WHERE 条款。)
以下是对规范的一种可能解释:
通过“选择此用户”,我们将其理解为希望返回 user_id 列。
通过“如果键列没有自定义行”,我们认为这意味着这个用户id不存在这样的行,然后返回这个用户id。如果这样的行存在,那么不返回用户id。
通过“and if key column have custom row->value column=yes”,我们将认为这意味着,如果此用户id有一行与条件匹配,则返回此用户id。
基于这种解释,下面是一种使用条件聚合来满足规范的方法:

SELECT t.user_id
   FROM this_table t 
  GROUP
     BY t.user_id
 HAVING SUM(1) = SUM(IF(t.key='custom',IF(t.value='yes',1,0),1))

sum()聚合中的表达式将为每一行求值。该表达式被设计为返回1或0,具体取决于行是否匹配指定的条件。这个 SUM() 把这些1和0加起来。然后我们将结果与总行数进行比较。它告诉我们是否存在“匹配”行。
计数是按用户标识进行的,如 GROUP BY 条款。
mysql IF() 函数可以替换为一个更便携的ansi CASE 表达

HAVING SUM(1) = SUM(CASE
                     WHEN t.key = 'custom' 
                     THEN CASE 
                          WHEN t.value = 'yes' 
                          THEN 1 
                          ELSE 0 
                          END
                     ELSE 1
                     END
                 )

如果要返回某个用户的所有详细信息行,但不包括符合规范的所有用户标识,则可以使用exists关联子查询:

SELECT t.user_id
      , t.key
      , t.value
   FROM this_table t
  WHERE NOT EXISTS ( SELECT 1
                       FROM this_table r
                      WHERE r.user_id = t.user_id 
                        AND r.key     = 'custom'
                   )
     OR EXISTS     ( SELECT 1
                       FROM this_table q
                      WHERE q.user_id = t.user_id 
                        AND q.key     = 'custom'
                        AND q.value   = 'yes'
                   )
vmjh9lq9

vmjh9lq92#

您可以使用下面的语句来选择任何行 key 不相等 'custom' 或同等 'custom' 以及 value 相等 'yes' ```
Select * from tableName where key<> 'custom' or (key = 'custom' and value = 'yes')

相关问题