[英]Mysql WHERE using AND & CASE Condition
我想在过程中给定的平台变量不为null的地方添加。
-编辑-
好的,这是一个过程。 程序根据用户的选择过滤结果。 (平台选择)
因此,在该过程中声明了平台变量。 如果用户将任何平台ID发送给过程,则结果必须使用平台变量过滤。 但是,如果平台变量为null或未定义,则将获得所有结果。
注意:我想找到一种在CASE语句中包含多个平台ID的方法
您可以在下面找到完整的代码。
-/编辑-
(
SELECT gn.title, gn.slug, gn.created_at, gn.content, gi.image, 'news' as `type` FROM `game_news` gn
CROSS JOIN `gallery_images` gi ON gi.foreign_key = gn.id
CROSS JOIN `game_platforms` gp
LEFT JOIN `game_news_platform_relation` gnpr ON gnpr.news_id = gn.`id`
WHERE gi.gallery_id = 7 AND gi.is_main = '1' AND `gi`.`thumbnail_id` = 16 AND gn.deleted_at IS NULL AND gi.deleted_at IS NULL
AND (
CASE
WHEN platform is NOT NULL
THEN gnpr.platform_id IN(platform)
END
)
GROUP BY gn.id
)
UNION ALL
(
SELECT gr.title, gr.slug, gr.created_at, gr.content, gi.image, 'review' as `type` FROM `game_reviews` gr
CROSS JOIN `gallery_images` gi ON gi.foreign_key = gr.id
CROSS JOIN `game_platforms` gp
LEFT JOIN `game_review_platform_relation` grpr ON grpr.review_id = gr.`id`
WHERE gi.gallery_id = 6 AND gi.is_main = '1' AND `gi`.`thumbnail_id` = 14 AND gr.deleted_at IS NULL AND gi.deleted_at IS NULL
AND (
CASE
WHEN platform is NOT NULL
THEN grpr.platform_id IN(platform)
END
)
GROUP BY gr.id
)
ORDER BY created_at DESC
LIMIT post_offset, post_limit
我怎样才能做到这一点?
要在案例内部使用IN(),它必须位于WHEN部分中,因此您可以这样操作。
AND
( CASE
WHEN platform IS NOT NULL AND gnpr.platform_id IN(platform)
THEN gnpr.platform_id
ELSE 1
END
)
您还可以添加另一个WHEN来插入所有此类内容。
AND
( CASE
WHEN platform IS NOT NULL AND gnpr.platform_id IN(platform)
THEN gnpr.platform_id
WHEN platform IS NULL
THEN gnpr.platform_id
END
)
为什么不在where子句上使用case,而是使用从表到平台的LEFT JOIN。 然后在where子句中评估platform.ID是否不为null。 希望这个想法对您有所帮助。
编辑
如果要在WHERE子句中使用CASE,则需要将其转换为布尔值。 像这样:
SELECT p FROM Table WHERE (CASE WHEN Machine ='myMachine' THEN 1 ELSE 0 END) = 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.