多条件为真时的取反方法及取反后数据丢失问题排查
问题:SQL条件取反后数据误删的排查与解决
咱先把情况捋清楚:我需要对下面表格里的每行指定条件做取反操作,但执行后发现部分本该保留的数据被误删了。先给大家看我的源数据和写了一半的查询语句:
源数据表格
| s_r | d_m | c_m | o_s | b_s | d_w | r_n |
|---|---|---|---|---|---|---|
| SW | SW | DM | A | A | 35RE% | |
| SW | SW | DM | B | B | 35RE% | |
| SW | SW | DM | B | A | ||
| SW | SW | DM | A | B | ||
| EB | SW | DM | A | A | 35RE% | |
| EB | SW | DM | B | B | 35RE% | |
| EB | SW | DM | B | A | ||
| EB | SW | DM | A | B |
我尝试的查询语句片段
SELECT * FR...
大概率踩的坑和解决思路
你现在的核心问题应该是取反逻辑写得不对,这是SQL里非常常见的错误,我给你梳理几个关键点:
- 别把“取反”写成“双重否定”:比如你原本想取反“o_s和b_s相等且d_w是35RE%”,正确的取反应该是
NOT (o_s = b_s AND d_w LIKE '35RE%'),而不是o_s != b_s AND d_w NOT LIKE '35RE%'——后者会把“o_s和b_s不等但d_w是35RE%”或者“o_s和b_s相等但d_w不是35RE%”的行都过滤掉,这就是你说的“误删数据”的原因。 - 别忘了处理NULL值:看你的表格里有些d_w是空值,SQL里NULL和任何值比较都会返回UNKNOWN,取反后还是UNKNOWN,会被WHERE子句过滤。如果你的取反逻辑要包含空值的情况,得明确写出来,比如
NOT (d_w LIKE '35RE%' OR d_w IS NULL)或者d_w NOT LIKE '35RE%' AND d_w IS NOT NULL,根据你的实际需求来。 - 先明确“原条件”再取反:建议你先把原本要排除的条件写清楚,然后用
NOT (原条件)来包裹,这样逻辑更清晰,不容易出错。比如你原本想排除“o_s=A且b_s=A且d_w=35RE%”的行,那取反保留的就是NOT (o_s = 'A' AND b_s = 'A' AND d_w LIKE '35RE%'),这样就能准确保留所有不符合这个排除条件的行。
如果能把你完整的WHERE子句贴出来,还能帮你更精准地调整,但先按这几个思路排查,应该能解决大部分问题。
内容的提问来源于stack exchange,提问作者SAMROX
相关产品推荐
相关产品推荐

