回答

收藏

SQL:标记哪个WHERE条件匹配

技术问答 技术问答 254 人阅读 | 0 人回复 | 2023-09-14

这是一个理论问题。我想知道是否有一个很好的方法来找出它WHERE句子中的条件匹配。  k1 ^2 ]0 d3 |
说我有这样的查询:1 E. H5 n. A7 r8 l
SELECT * FROM table WHERE    COND1 OR    (COND2 AND COND3) OR    COND4使给定行匹配(或不匹配)的方法是什么?
/ Y0 R- `% r; M( t我想到的一个解决方案是SELECT中添加一个CASE然后为银行重新运行所有子句WHERE条件:
2 E( b, L8 v3 o  rSELECT *,which_cond = CASE .... END CASE ...               
  N6 `+ \8 I* C" L    解决方案:                                                                % g% s! L( ?3 ^, i" F7 l6 }/ H- Y* N
                                                                CASE有可能。但是写得更短。IF()(至少对MySQL):2 L% }4 }/ e% q" B; G/ C& K' d; K8 H
SELECT *,IF(COND2,1,0) AS cond2,IF(COND3,1,0) as cond3 ...并且每个cond*匹配值为1。8 ^, s+ ^$ _, S5 e
当然,检查一下COND1.匹配毫无意义。你将得到所有结果的回报COND一是事实IF(COND1、1、0)将永远返回1(在你的例子中)。
$ X/ ~( ]! T2 r1 f- i7 q' U; y: q更新    :# W9 {* F  a: J7 x$ x2 o/ ]$ l  r% U+ E
至少对于MySQL我发现,如果你只想得到其中一个1或0作为结果,以下内容就足够了:
6 e0 ?4 A9 W2 `6 kSELECT *,COND2 AS cond2,COND3 as cond3 ...对于Mark如果你使用答案HAVING代替WHERE(HAVING作为对别名的访问权限),则可以避免两次编写条件:
( X$ l2 e$ e- B6 ]6 y$ c4 ISELECT *,COND2 AS cond2,COND3 as cond3FROM tableHAVING COND1 AND (cond2 OR cond3)(注:大写表达实际情况,小写为别名)
2 T8 s$ @: @( T$ W$ o1 u更新2:- H; K* Y: L' h! l
嗯,变化不大:你只需要检查一下OR更新版本中的连接条件足以检查是否通过连接条件进行更新COND2是真的。如果是这样的话,那么COND反之亦然。
" U1 z# n4 x1 Q& m$ K3 M8 o2 \SELECT *,COND1 AS cond1,COND2 as cond2,COND4 as cond4FROM tableHAVING cond1 OR (cond2 AND COND3) OR cond4我觉得很清楚。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则