SQL问题咨询:如何解决条件未生效并让R1列返回非1数值?
这问题我之前也踩过坑,核心是SQL运算符优先级的误区,再加上你不小心加了限制R1列的条件,咱们一步步解决:
问题根源拆解
你的SQL里OR的优先级比AND低,导致实际执行逻辑和预期完全不符:
-- 实际执行的逻辑 (upcNameId = 'ExampleName' AND event_param_2 = 1 AND event_datetime >= '2017-01-01 00:00:00' AND event_datetime <= '2018-04-01 00:00:00' AND event_code = 51) OR event_code = 52 OR event_code = 53 OR event_code = 54
也就是说,只有event_code=51的行会受前面所有条件约束,而event_code=52/53/54的行直接被选中,完全无视upcNameId、时间范围这些条件——这就是你说的「条件未生效」的原因。另外,你明确加了AND event_param_2 = 1,所以R1列(对应event_param_2)自然只能显示1,要拿到其他数值就得去掉这个限制条件。
修改后的SQL(两种写法)
写法1:用括号修正OR逻辑
SELECT event_datetime AS day, event_param_2 AS R1, event_param_3 AS Content, event_code FROM events WHERE upcNameId = 'ExampleName' AND event_datetime >= '2017-01-01 00:00:00' AND event_datetime <= '2018-04-01 00:00:00' AND (event_code = 51 OR event_code = 52 OR event_code = 53 OR event_code = 54);
写法2:用IN简化(更易读)
SELECT event_datetime AS day, event_param_2 AS R1, event_param_3 AS Content, event_code FROM events WHERE upcNameId = 'ExampleName' AND event_datetime >= '2017-01-01 00:00:00' AND event_datetime <= '2018-04-01 00:00:00' AND event_code IN (51, 52, 53, 54);
修改说明
- 用括号把
event_code的判断包裹起来,确保前面的upcNameId、时间范围条件对所有指定的event_code行都生效,彻底解决「条件未应用」的问题; - 移除了
AND event_param_2 = 1,解除对R1列的数值限制,这样就能返回符合其他条件的所有event_param_2值了。
如果之后你需要筛选R1列包含1和其他特定数值,可以再加AND event_param_2 IN (1, X, Y...)这样的条件,按需调整即可。
内容的提问来源于stack exchange,提问作者nico
相关产品推荐
相关产品推荐

