| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2796 人关注过本帖, 1 人收藏
标题:IN 和 INLIST() 在 where 条件中有缺陷
取消只看楼主 加入收藏
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
结帖率:100%
收藏(1)
 问题点数:0 回复次数:6 
IN 和 INLIST() 在 where 条件中有缺陷
IN 和  INLIST() 在 where 条件中有缺陷,以下语句的where 条件返回的全是 真 值 (只是测试,随便一个数据表)

SELECT * FROM c:\tmp WHERE '02' in ('0201')
SELECT * FROM c:\tmp WHERE '0201' in ('02')
SELECT * FROM c:\tmp WHERE '0201' in ('020101')

SELECT * FROM c:\tmp WHERE INLIST('02','0201')
SELECT * FROM c:\tmp WHERE INLIST('0201','02')
SELECT * FROM c:\tmp WHERE INLIST('0201','020101')
--------------------------------------------------------------
本来用数字直接表示 条件表达式中它们的关系,而这样的关系,条件表达式却返回 真 值。可现在看来真需要给个例子了.
如 有个表(就dm这字段吧),里有如下这些记录。
dm
0201
02
0202
0204
那么我想查询 DM 为 02和0202的记录。
select * from  表 where INLIST(dm,'0202','02')
结果出来:
0201
02
0202
0204
你们试是否这样。
-------------------------------------------
现找到解决这问题的初步办法(还需大量数据验证)。
办法就是在各字符子串后加上一个空格
如 INLIST(dm,'0202 ','02 ')
或 dm in ('0202 ','02 ')
select * from  表 where INLIST(dm,'0202 ','02 ')

现在发现多加的这空格很奥妙,
select * from 表 where  dm='02 ' &&多了一个空格
select * from 表 where  dm=='02'
以上这两句是等价的

而下面的结果就非常不一样了.
select * from 表 where  dm='02' &&没加空格









[ 本帖最后由 kiff 于 2013-3-25 17:44 编辑 ]
搜索更多相关主题的帖子: 表达式 数据表 where 
2013-03-24 19:17
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
收藏
得分:0 
以下是引用bccn201203在2013-3-24 19:44:27的发言:

楼主SQL-SELECT 命令的用法就有问题,并不是SQL-SELECT 命令的缺限。
SELECT * FROM c:\tmp WHERE '02' in ('0201')
楼主能说说这条件命令的意思是什么?标准语法又是如何?
INLIST()函数的语法格式是如何写的?
认真看看帮助文件吧

空手就来发贴
帮助文件就不用看了,不明用意的就算了。
2013-03-24 19:46
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
收藏
得分:0 
现给个例子,这是我在日常工作中遇到的问题,只希望讨论怎么可以避开这问题,其它什么 SQL 语句就不要说了,几句简单sql,我是会的 。

[ 本帖最后由 kiff 于 2013-3-25 10:03 编辑 ]
2013-03-25 08:30
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
收藏
得分:0 
以下是引用TonyDeng在2013-3-25 11:17:32的发言:

这是字符串比较的默认设置造成的,没有使用精确(set exact on或==算符)比较。对别的数据类型,不会出现这种现象,但对字符串,就会存在这种问题。
    我用set exact on 结果也是这样,查过资料,set exact on 不适用vfp的 SQL,我前天统计数据时发现这问题

[ 本帖最后由 kiff 于 2013-3-25 11:22 编辑 ]
2013-03-25 11:20
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
收藏
得分:0 
以下是引用TonyDeng在2013-3-25 11:25:42的发言:

in是SQL的语法,SQL语法并不是VFP语言本身设计的,它怎么工作是这个指令体系自己的事,我从来回避用SQL指令,不知道,你说的不适用是指在in参数下。在inlist()中,就归VFP管,你测试一下inlist("02", "0201")和inlist("0201", "02")的返回结果就知道了。
测试了,以下结果一样。
inlist(DM,"02", "0201")和inlist(DM,"0201", "02") 、DM IN ("02", "0201")、DM IN ("0201", "02")
如果是sqlserver 或 oracle ,DM IN ("02", "0201")就没这问题



[ 本帖最后由 kiff 于 2013-3-25 11:31 编辑 ]
2013-03-25 11:29
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
收藏
得分:0 
以下是引用TonyDeng在2013-3-25 11:33:05的发言:

VFP执行INLIST("0201", "02")函数,转换为逻辑判断"0201"="02",在set exact off下,这个结果为真,反之为假。
是的,在命令窗口测试,如 ?INLIST("0201", "02"),确是这结果,但用在 vfp SQL  就不一样了.
2013-03-25 11:35
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
收藏
得分:0 
现找到解决这问题的初步办法(还需大量数据验证)。
办法就是在各字符子串后加上一个空格
如 INLIST(dm,'0202 ','02 ')
或 dm in ('0202 ','02 ')
--------------------------
现在发现多加的这空格很奥妙,
select * from 表 where  dm='02 ' &&多了一个空格
select * from 表 where  dm=='02'
以上这两句是等价的

而下面的结果就非常不一样了.
select * from 表 where  dm='02' &&没加空格




[ 本帖最后由 kiff 于 2013-3-25 17:43 编辑 ]
2013-03-25 16:58
快速回复:IN 和 INLIST() 在 where 条件中有缺陷
数据加载中...
 
   



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

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