我正在使用REGEXP的CASE语句将评论分配到不同的主题桶中。尽管REGEXP在这方面做得很好,但有些评论可能仍未分配给任何存储桶,这就是我需要“其他”列的原因。如何修改下面的查询来实现这一目标?
SELECT
review,
CASE
WHEN review REGEXP 'relevant keywords'
AND review REGEXP 'additional keywords if necessary'
THEN 1
ELSE 0
END AS 'Cleanliness',
CASE
WHEN review REGEXP 'relevant keywords'
AND review REGEXP 'additional keywords if necessary'
THEN 1
ELSE 0
END AS 'Food',
CASE
WHEN review REGEXP 'relevant keywords'
AND review REGEXP 'additional keywords if necessary'
THEN 1
ELSE 0
END AS 'Wifi'
FROM review_table;
我的CASE
语句有多个AND
条件所以添加另一个CASE
声明与NOT REGEXP
似乎不是一个整洁的选择。请注意,评论可以属于多个主题。
最终结果将是一个看起来像这样的视图:
一种解决方案是创建另一个表示所有其他表达式否定的REGEX表达式。但这很快就会变得乏味。
另一种选择是只包装查询并分析外部查询中的结果以生成附加列。这应该很简单:
SELECT x.*, (Cleanliness + Food + Wifi = 0) AS Other
FROM (
--- original query
) x
提示:在MySQL中,条件表达式的返回值在成功时为1
,在失败时为0
。这意味着这个表达式:
CASE
WHEN review REGEXP 'relevant keywords'
AND review REGEXP 'additional keywords if necessary'
THEN 1
ELSE 0
END AS 'Cleanliness'
也可以写成:
(
review REGEXP 'relevant keywords'
AND review REGEXP 'additional keywords if necessary'
) AS 'Cleanliness'
我想我们可以使用NOT(expression)
命令
CASE
WHEN review NOT (REGEXP 'relevant keywords'
AND review REGEXP 'additional keywords if necessary' )
THEN 1
ELSE 0
END AS 'Irrelevant'