| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2798 人关注过本帖, 1 人收藏
标题:IN 和 INLIST() 在 where 条件中有缺陷
只看楼主 加入收藏
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
结帖率:100%
收藏(1)
 问题点数:0 回复次数:18 
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
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:0 
以下是引用kiff在2013-3-24 19:17:25的发言:

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

空手就来发贴
2013-03-24 19:44
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
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
收藏
得分:0 
以下是引用kiff在2013-3-24 19:46:58的发言:

帮助文件就不用看了,不明用意的就算了。
不知楼主有何用意
2013-03-24 19:48
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
这是?
2013-03-25 00:09
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
诸位淡定。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2013-03-25 06:47
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
技术讨论中不要涉及其他,这样大家都能得到提高。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2013-03-25 06:48
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
以下是引用hu9jj在2013-3-25 06:48:25的发言:

技术讨论中不要涉及其他,这样大家都能得到提高。
说得好
2013-03-25 07:06
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
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这是字符串比较的默认设置造成的,没有使用精确(set exact on或==算符)比较。对别的数据类型,不会出现这种现象,但对字符串,就会存在这种问题。

授人以渔,不授人以鱼。
2013-03-25 11:17
快速回复:IN 和 INLIST() 在 where 条件中有缺陷
数据加载中...
 
   



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

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