标题:VFP数据对比问题,几乎同样的语句 ,出现了不同的结果(已上次测试数据)
取消只看楼主
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
结帖率:100%
 问题点数:0 回复次数:10 
VFP数据对比问题,几乎同样的语句 ,出现了不同的结果(已上次测试数据)
两个对比语句,唯一的差别就是其中一个多了alltrim,不知道为什么结果会不同?原理是什么,谁能说的清楚,非常感谢!!
SELECT * from f1 where lxfs NOT in  (SELECT lxfs from ys1) ;             &&出现2个不同记录
SELECT * from f1 where alltrim(lxfs) NOT in  (SELECT lxfs from ys1) ;  &&没有不同记录


对比表数据表.zip (500 Bytes)


[此贴子已经被作者于2021-8-21 12:54编辑过]

搜索更多相关主题的帖子: 语句 结果 对比 不同 数据 
2021-08-21 12:53
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
得分:0 
以下是引用sdta在2021-8-21 13:32:50的发言:

试试:
SELECT * from f1 where VAL(lxfs) NOT in  (SELECT VAL(lxfs) from y1)

按这个结果和不加alltrim是一样的,能说说这几个语句的区别到底在哪里吗?

喜欢VFP,就要学懂弄通!
2021-08-21 13:36
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
得分:0 
以下是引用sdta在2021-8-21 13:46:03的发言:


测试结果不一定是包含关系,比较是按字段宽度的内容比较,如果(被)比较字段(如F1表的LXFS)用了ALLTRIM(),应该是包含关系。自己可以测试下
SELECT * from f1 where lxfs NOT in  (SELECT lxfs from y1) && 精确比较,按字段宽度中的内容比较
SELECT * from f1 where alltrim(lxfs) NOT in  (SELECT lxfs from y1) && 非精确比较
SELECT * from f1 where lxfs NOT in  (SELECT alltrim(lxfs) from y1) && 精确比较

好像是你说的这样的,我再验证下,之前你VAL函数其实就是把字符转成了数字进行比较,转换后,相当于去掉了空格,这个应该也是精准对比吧?
经过测试发现,精确比较的时候好像是自动忽略了空格的长度的,也就是说两个比较的字段即使设置的字段宽度不一样,用不用alltrim,只要字段内容一样,最后对比结果相同。
另外,请教个问题:ALLTRIM(lxfs,0h0920) 这个函数中的参数0h0920是什么意思?查不到资料。


[此贴子已经被作者于2021-8-21 15:39编辑过]


喜欢VFP,就要学懂弄通!
2021-08-21 14:37
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
得分:0 
以下是引用sdta在2021-8-21 15:54:50的发言:

0h0920 16进制还原为10进制应该是2336

语句:SELECT * from f1 where ALLTRIM(lxfs) NOT in  (SELECT lxfs from y1)

对比又有新发现,看图,这个怎么解释啊?既不包含又不精确对比。。。搞不懂了,对比数据附后。请两位大侠帮忙分析分析


对比表new.rar (460 Bytes)


[此贴子已经被作者于2021-8-21 16:21编辑过]


喜欢VFP,就要学懂弄通!
2021-08-21 16:20
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
得分:0 
以下是引用吹水佬在2021-8-21 16:42:42的发言:

“8027878390”与“08027878390”怎比也是.F.

那其他几条记录也应该是.F.啊?为什么唯独只有这一条?这就是我想问的!

喜欢VFP,就要学懂弄通!
2021-08-21 17:08
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
得分:0 
以下是引用sdta在2021-8-21 17:12:25的发言:

数据规范化是重点

看了半天,没找出数据哪里有问题啊,难道是我没发现吗?麻烦指出指出,谢谢!

喜欢VFP,就要学懂弄通!
2021-08-21 17:19
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
得分:0 
以下是引用xuminxz在2021-8-21 16:47:21的发言:

如果要精确比较,where 中的 字符串长度必须与 in 中的长度一致;或者要保证,in中的字符长度不大于 alltrim()后的长度。如果能保证可以转化为整数不溢出,可用val()转化为后比较,也可用以下语句。

SELECT * FROM f1 WHERE lxfs NOT in (SELECT f1.lxfs FROM f1 JOIN y1 ON ALLTRIM(f1.lxfs)==ALLTRIM(y1.lxfs))
数据库中首先要尽可能使数据正确。我以为你的第一个任务是查找无效电话号码。

我的主要目的是查找两个表中lxfs字段中不相同的记录。按你的说法,这个比较结果不同的记录不应该只有一条啊?

喜欢VFP,就要学懂弄通!
2021-08-21 17:37
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
得分:0 
以下是引用吹水佬在2021-8-21 17:20:05的发言:


其他的如果不是精确比对就是.T.,参考11楼的意见。

8027878390和08027878390   是包含关系
17671637和+8617671637     也是包含关系
都是前面字符不同,后面一样,如果是不精准对比,也应该都是.T.  ,我不明白和其他几条记录的差别在哪里?
有点晕

喜欢VFP,就要学懂弄通!
2021-08-21 17:41
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
得分:0 
我怎么还是没有彻底弄懂,是我太笨了吗

喜欢VFP,就要学懂弄通!
2021-08-21 18:22
hjlali
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2008-12-23
得分:0 
以下是引用sdta在2021-8-21 19:09:54的发言:

看下帮助文件中
SET ANSI 命令
SET EXACT 命令
select - sql 命令(VFP6、VFP9)
关于字符串比较的详细解释

这个我慢慢去学习,现在我就是想弄明白下:
执行这个条语句后
SELECT * from f1 where ALLTRIM(lxfs) NOT in  (SELECT lxfs from y1)
为什么只筛选出了一条记录,区别在哪里?
8027878390和08027878390   是包含关系
17671637和+8617671637     也是包含关系
为什么8027878390找出来了,而17671637没找出来呢?

喜欢VFP,就要学懂弄通!
2021-08-21 19:13



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-506598-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019849 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved