我有这张桌子。
在MySql中,我想选择此用户IF key
列没有custom
行并且IF key
列没有custom
行-> value
列= yes
。
这是我的查询,但不起作用:
where `value` = if(`key` = 'custom', 'yes', '')
答案 0 :(得分:2)
您可以使用以下语句,选择任何行中key
不等于'custom'
或等于'custom'
且value
等于'yes'
Select * from tableName where `key`<> 'custom' or (`key` = 'custom' and `value` = 'yes')
答案 1 :(得分:0)
该查询的规范尚不清楚,因为它可以接受几种不同的解释。
我在考虑的问题是如何返回特定结果,而不是真正地在IF()
子句中使用WHERE
函数。 (下面的SQL都不在IF()
子句中使用WHERE
函数。)
以下是该规范的一种可能解释:
通过“选择此用户”,我们将其表示要返回user_id
列的单个副本。
通过“ IF键列没有自定义行”,我们将其表示该user_id不存在这样的行,然后返回此user_id。如果确实存在这样的行,则不要返回用户。
通过“ AND IF键列具有自定义行->值列= yes。”,我们认为如果该user_id的行符合条件,则返回该user_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
子句中的user_id进行计数。
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
)
如果目的是返回用户的所有详细信息行,但排除所有符合规范的user_id,则可以使用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'
)