注册 登录
编程论坛 VFP论坛

VFP数据对比问题,几乎同样的语句 ,出现了不同的结果(已上次测试数据)

hjlali 发布于 2021-08-21 12:53, 2561 次点击
两个对比语句,唯一的差别就是其中一个多了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) ;  &&没有不同记录


只有本站会员才能查看附件,请 登录


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

22 回复
#2
sdta2021-08-21 13:32
试试:
SELECT * from f1 where VAL(lxfs) NOT in  (SELECT VAL(lxfs) from y1)
#3
hjlali2021-08-21 13:36
以下是引用sdta在2021-8-21 13:32:50的发言:

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

按这个结果和不加alltrim是一样的,能说说这几个语句的区别到底在哪里吗?
#4
sdta2021-08-21 13:46
以下是引用hjlali在2021-8-21 13:36:52的发言:


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

测试结果不一定是包含关系,比较是按字段宽度的内容比较,如果(被)比较字段(如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) && 精确比较

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

#5
hjlali2021-08-21 14:37
以下是引用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编辑过]

#6
sdta2021-08-21 15:54
0h0920 16进制还原为10进制应该是2336

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

#7
吹水佬2021-08-21 16:10
0h0920==chr(0x09)+chr(0x20)
#8
吹水佬2021-08-21 16:12
这个是什么意思,in 与 not in 结果一样?
程序代码:
CREATE CURSOR f1 (lxfs C(10))
INSERT INTO f1 VALUES ("123")
CREATE CURSOR y1 (lxfs C(10))
INSERT INTO y1 VALUES ("123456")

SELECT * from f1 where lxfs in (SELECT lxfs from y1)      && .T.
SELECT * from f1 where lxfs NOT in (SELECT lxfs from y1)  && .T.
#9
hjlali2021-08-21 16:20
以下是引用sdta在2021-8-21 15:54:50的发言:

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

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

对比又有新发现,看图,这个怎么解释啊?既不包含又不精确对比。。。搞不懂了,对比数据附后。请两位大侠帮忙分析分析
只有本站会员才能查看附件,请 登录


只有本站会员才能查看附件,请 登录


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

#10
吹水佬2021-08-21 16:42
“8027878390”与“08027878390”怎比也是.F.
#11
xuminxz2021-08-21 16:47
如果要精确比较,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))
数据库中首先要尽可能使数据正确。我以为你的第一个任务是查找无效电话号码。

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

#12
hjlali2021-08-21 17:08
以下是引用吹水佬在2021-8-21 16:42:42的发言:

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

那其他几条记录也应该是.F.啊?为什么唯独只有这一条?这就是我想问的!
#13
sdta2021-08-21 17:12
数据规范化是重点
#14
hjlali2021-08-21 17:19
以下是引用sdta在2021-8-21 17:12:25的发言:

数据规范化是重点

看了半天,没找出数据哪里有问题啊,难道是我没发现吗?麻烦指出指出,谢谢!
#15
吹水佬2021-08-21 17:20
以下是引用hjlali在2021-8-21 17:08:00的发言:


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

其他的如果不是精确比对就是.T.,参考11楼的意见。
#16
hjlali2021-08-21 17:37
以下是引用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字段中不相同的记录。按你的说法,这个比较结果不同的记录不应该只有一条啊?
#17
hjlali2021-08-21 17:41
以下是引用吹水佬在2021-8-21 17:20:05的发言:


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

8027878390和08027878390   是包含关系
17671637和+8617671637     也是包含关系
都是前面字符不同,后面一样,如果是不精准对比,也应该都是.T.  ,我不明白和其他几条记录的差别在哪里?
有点晕
#18
hjlali2021-08-21 18:22
我怎么还是没有彻底弄懂,是我太笨了吗
#19
sdta2021-08-21 19:09
看下帮助文件中
SET ANSI 命令
SET EXACT 命令
select - sql 命令(VFP6、VFP9)
关于字符串比较的详细解释
#20
hjlali2021-08-21 19:13
以下是引用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没找出来呢?
#21
吹水佬2021-08-21 20:16
以下是引用hjlali在2021-8-21 19:13:16的发言:

为什么8027878390找出来了,而17671637没找出来呢?

y1有1767163756,不是精确比对时 “1767163756” = “17671637”

#22
吹水佬2021-08-21 20:21
8027878390与08027878390比对,可以简化为“8”与“08”的比对,怎样比对都不可能相=
字符串的比对是从左到右逐个字符比对
#23
hjlali2021-08-21 20:27
以下是引用吹水佬在2021-8-21 20:16:29的发言:


y1有1767163756,不是精确比对时 “1767163756” = “17671637”

懂了,是我一直看错字段了,出现了思维定势,程序应该是从左到右的顺序逐个匹配的,谢谢指点!!
1