注册 登录
编程论坛 VFP论坛

求助:应该如何设置删除条件?

zhousr 发布于 2022-05-27 23:09, 2011 次点击
表A,其中包含专业名称(zymc)、备注(bz)两个字段。表的内容是专业名称或备注字段中包含“化学”两个字的记录,如化学、应用化学、化学工程与工艺等。我的需求是:删除表中专业名称不是“化学”而且备注中没有“化学”和“应用化学”两个专业的所有记录,但专业名称如果是“化学(师范)”或者是“化学类”的,应该保留。
可能出现在专业名称或备注中的含“化学”两个字的专业有:化学、应用化学、化学生物学、能源化学、化学工程与工艺、能源化学工程、化学工程与工业生物工程、药物化学、化学测量学与技术、地球化学、材料化学。
我需要保留专业名称是“化学”、“化学(师范)”或者是“化学类”的,或者专业名称不是前面三个但备注中有“化学”或者“应用化学”专业的,其他全部删除。
请教:这样的删除条件应该怎么写?
谢谢!
只有本站会员才能查看附件,请 登录
18 回复
#2
schtg2022-05-28 05:35
回复 楼主 zhousr
可以直接筛选吗:试一试
SELECT * FROM A WHERE "化学"$zymc OR "化学"$bz INTO table db
#3
sdta2022-05-28 07:04
或者专业名称不是前面三个但备注中有“化学”或者“应用化学”专业的
请楼主解释下这句话的意思

化学、化学类、材料化学、能源化学专业等是否算 化学 专业,还是 化学专业 才符合条件
#4
zhousr2022-05-28 08:58
以下是引用schtg在2022-5-28 05:35:45的发言:

可以直接筛选吗:试一试
SELECT * FROM A WHERE "化学"$zymc OR "化学"$bz INTO table db


谢谢!这张表就是从一个更大的表中用你说的方法筛选出来的,需要再去除一些不完全符合条件的记录。
#5
zhousr2022-05-28 09:02
以下是引用sdta在2022-5-28 07:04:15的发言:

或者专业名称不是前面三个但备注中有“化学”或者“应用化学”专业的
请楼主解释下这句话的意思

化学、化学类、材料化学、能源化学专业等是否算 化学 专业,还是 化学专业 才符合条件


谢谢,我没表达清楚。就是“化学”、“化学(师范)”、“化学类”、“应用化学”四种可以算,其他的如材料化学等都不算,都要删除。
#6
my23182022-05-28 09:16
就按你的逻辑写就行了
#7
zhousr2022-05-28 09:35
以下是引用my2318在2022-5-28 09:16:05的发言:

就按你的逻辑写就行了


我发现,从逻辑到代码还是有点距离
#8
laowan0012022-05-28 10:01
我需要保留专业名称是“化学”、“化学(师范)”或者是“化学类”的,或者专业名称不是前面三个但备注中有“化学”或者“应用化学”专业的,其他全部删除。
按上面句子的描述:
delete from 表名 where
not (zymc IN (“化学”,“化学(师范)”,“化学类”) OR
zymc NOT IN (“化学”,“化学(师范)”,“化学类”) AND (“化学”$bz OR “应用化学”$bz))
是不是这个意思
#9
zhousr2022-05-28 10:38
回复 8楼 laowan001
谢谢!我试一下
#10
zhousr2022-05-28 11:32
重新理了一下思路,发现需求表述有问题。其实只要删除专业名称不是“化学”、“化学(师范)”、“化学类”并且备注字段里没有“化学”或者“应用化学”专业的记录即可。
DELETE FROM a WHERE NOT zymc IN ("化学","化学(师范)","化学类") AND NOT ("化学"$bz OR "应用化学"$bz)
结果不尽人意:一是专业名称如“化学工程与工艺”且备注字段为空的,没有删掉;二是如专业名称为“化工与制药类”且备注字段中有“化学工程与工艺”等出现“化学”两字的,也没有删掉。
不知有没更好的办法?谢谢!
#11
zhousr2022-05-28 12:20
笨办法,枚举,好在选项不多,解决了第一个问题:
DELETE FROM a WHERE NOT zymc IN ("化学","化学(师范)","化学类") AND NOT ("化学"$bz OR "应用化学"$bz) OR zymc in ("化学工程","化学测量")
第二个问题,牵涉到在备注中如何精确查找的问题,如何解决呢?
#12
sdta2022-05-28 13:31
为什么要删除,过滤一下不行吗
#13
zhousr2022-05-28 13:49
以下是引用sdta在2022-5-28 13:31:42的发言:

为什么要删除,过滤一下不行吗


过滤也行,只是这个过滤条件该怎么写呢?
#14
sdta2022-05-28 13:55
LOCAL lazymc[3]
lazymc[1] = "化学"
lazymc[2] = "化学类"
lazymc[3] = "化学(师范)"
lczymc = 'alltrim(zymc) == "' + lazymc[1] + '"'

FOR ln = 2 TO ALEN(lazymc, 1)
    lczymc = lczymc + ' OR ' + 'alltrim(zymc) == "' + lazymc[ln] + '"'
ENDFOR

SELECT * FROM a1 WHERE &lczymc OR "、应用化学" $ bz OR "、化学、" $ bz
#15
zhousr2022-05-28 13:59
谢谢,稍等,我好好消化一下
#16
sdta2022-05-28 14:04
可以把 bz 字段中与 化学 或 应用化学 有关的组合整理一下
如 化学 :、化学、
如 应用化学 :、应用化学、  、应用化学    应用化学、


[此贴子已经被作者于2022-5-28 14:08编辑过]

#17
sdta2022-05-28 14:16
SELECT * FROM a1 WHERE &lczymc OR "、应用化学" $ bz OR "化学、" $ bz
根据自己的需要,自行修改
#18
zhousr2022-05-28 15:59
回复 16楼 sdta
对,你考虑得非常仔细。受你启发,问题已经较好地解决了。
比如我只要“化学”专业,在备注中的位置可能是:含化学、。。。、化学、。。。、化学专业等。用了类似  REPLACE all bz with STRTRAN(bz,"含"+zy+"、","假"+zy)  的语句,替换备注字段总分内容,然后搜索就成了。
谢谢你,也谢谢大家!
在这个论坛里总能学到好多,感谢所有热心人!
#19
xuminxz2022-05-28 19:53
这类问题我一般用笨办法,dele 全部删除,recall恢复需要的。或者用Select * from 生成需要的
1