标题:left()函数在VFP FOR与VFP+SQL查询中使用结果为何不同?
取消只看楼主
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
结帖率:79.3%
已结贴  问题点数:20 回复次数:10 
left()函数在VFP FOR与VFP+SQL查询中使用结果为何不同?
left()在下列查询语句中截取不同的位数
select xm,xh from bmk0651 where left(xm,1)='周'
select xm,xh from bmk0651 where left(xm,2)='周'
select xm,xh from bmk0651 where left(xm,3)='周'
查询结果一样


但在
brow fiel xm for left(xm,2)='周'  &&才能产生正确的结果
搜索更多相关主题的帖子: where 
2013-08-21 15:25
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
一般情况下,姓名是中文,截取2位
为什么VFP+SQL中left(xm,1)='周'或left(xm,3)='周'也能得出正确的结果?
而VFP+SQL中subs(xm,1,2)='周'结果是正确,但改为SUBS(xm,1,3) =‘周'错了!



[ 本帖最后由 sylknb 于 2013-8-22 10:11 编辑 ]
2013-08-22 10:07
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
设置set exact on ,还是老样。
2013-08-22 16:26
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
当然知道一个汉字是2个字节,用LEFT()=='周',用=不是完全等于关系,是从第一位开始包含的都算 。
我说的是为什么?
select xm,xh from bmk0651 where left(xm,1)='周'
select xm,xh from bmk0651 where left(xm,2)='周'
select xm,xh from bmk0651 where left(xm,3)='周'
查询结果一样

而用 brow for left(xm,1)='周'  是错误的
2013-08-23 08:22
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
太深奥了。
2013-08-23 11:34
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
sele * from alias() where left(xm,1)="周"的结果

sele * from alias() where left(xm,2)="周"结果

sele * from alias() where left(xm,3)="周"结果



[ 本帖最后由 sylknb 于 2013-8-23 12:10 编辑 ]
2013-08-23 12:06
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
各位可以试试:“BROWSE FOR LEFT(姓名,1)=LEFT([州],1)”或“BROWSE FOR LEFT(姓名,1)=[]”,前者一定会出来姓名字段的第一字节机内码是214的所有记录,而后者一定会出来所有记录。原理就是我上面说的,第一条命令等号两边长度相等,第二条命令等号右边长度小于左边的,所以这两条命令有了比较机内码大小的机会。
你指的哪二条命令?
2013-08-23 14:20
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
再看BROWSE命令,由于它采用了FoxPro 9.0自身的规则来比较,所以就不同了。FoxPro 9.0对于“=”的自身规则是:首先比较等号两边的字串长度,如果右边的长度小于等于左边,再开始逐位比机内码大小,然后的过程就与SQL命令的一样。若右边长度大于左边长度,直接就判定不等于,而不管它们的前几字节机内码是否相等。各位可以试试:“BROWSE FOR LEFT(姓名,1)=LEFT([州],1)”或“BROWSE FOR LEFT(姓名,1)=[]”,前者一定会出来姓名字段的第一字节机内码是214的所有记录,而后者一定会出来所有记录。原理就是我上面说的,第一条命令等号两边长度相等,第二条命令等号右边长度小于左边的,所以这两条命令有了比较机内码大小的机会。
taifu945:
你说的哪二条命令?
我以下和命令是不是你说的?实验如下:

brow for left(xm,1)=left('州',1),=左,右长度相等,全部记录出来

brow for left(xm,1)=left('州',2)=右长度>左长度

BROWSE FOR LEFT(xm,1)=[],=左长度>右长度 全部记录出来了

2013-08-23 14:47
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
1。brow for left(xm,1)=left('周',1)  &&左=右
结果:全部记录
2。brow for left(xm,1)=left('周',2) &&左<右
结果:空记录
3。brow for left(xm,3)=left('周',1)&& 左>右
结果:11条,含有与周的第一字节的记录。
2013-08-23 15:29
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1519
专家分:174
注 册:2006-6-3
得分:0 
第一条命令因为两边等长,机内码的值又是“相等”,所以输出全部记录

brow for left(xm,1)=left('周',1)  &&左=右
我所说的全部记录是表中所有记录什么姓名都有,不光与了‘周’内码214相等的的姓名也有同码不是214的如‘陆’(49853),王(52725)
1。你说的机内码的值又是“相等”是指什么?是不是214,等等
2。知‘周’55004,用什么方法知道: 低八位chr(220)+高八位chr(214)?
2013-08-23 16:08



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




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

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