SSIS,派生列OR字符串比较??

kyouken2007 2010-10-03 09:24:41
添加一个派生列组件,按照某些条件生成一个bool型的派生列。

问题就出在这个条件上。

我想用字符串比较,比如说 [列A]>"99",我认为字符串比较大小是按照阿斯克码逐位去比较的,
但事后后来我发现我错了,经过测试,发现当[列A]的值为“9:”的时候,返回结果是false,
就是说比较的结果认为“9:”是小于“99”的。

谁能给我分析一样为什么会这样?
...全文
891 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
BIConsulting 2010-10-14
  • 打赏
  • 举报
回复
脚本组件
string.Compare("9:","99",StringComparison.Ordinal)>0

参考:
http://social.technet.microsoft.com/Forums/en-US/sqlintegrationservices/thread/a8c6898e-0b74-4222-8e1b-785cf39cc9e3
BIConsulting 2010-10-13
  • 打赏
  • 举报
回复
你可以测试下当列A为"9:9"时如何?
或者直接比较下"9:9"和"99"
kyouken2007 2010-10-04
  • 打赏
  • 举报
回复
在SSIS里如何解决
「已注销」 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 kyouken2007 的回复:]

总拿SELECT ASCII('9:'),SELECT ASCII('99')说什么事,我是要字符串比大小。
[/Quote]
经验再多,要是错误的都是白搭。
还有不是我拿什么说事,只是楼上谈到了ascii比较而已,要是说事,我都懒得跟你浪费时间。
你的字符串比较大小转换成binary类型就可以解决了。

参考:
SELECT CASE WHEN (CAST('9A' AS binary)>=CAST('99' AS BINARY)) THEN 1 ELSE 0 END res

res
-----------
1

(1 row(s) affected)
kyouken2007 2010-10-03
  • 打赏
  • 举报
回复
不过字段单纯的定义成Char型,似乎也有问题的。
kyouken2007 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sql77 的回复:]
DECLARE @T TABLE(NAME NVARCHAR(2))
INSERT @T SELECT N'99' UNION ALL SELECT N'9:'

SELECT * FROM @T WHERE NAME>N'9:'

NAME
----
99

(所影响的行数为 1 行)

DECLARE @TA TABLE(NAME VARCHAR(2))
INSERT @TA SELECT '99' UNION ALL SELECT '9:'

SELECT * FROM @TA WHERE NAME>':9'

NAME
----
99
9:

(所影响的行数为 2 行)

[/Quote]


这结果确实是很奇怪的。
SQL77 2010-10-03
  • 打赏
  • 举报
回复
SELECT ASCII(N'99') AS '99',ASCII(N'9:') AS'9:'

SELECT ASCII(N'9') AS '9',ASCII(N':') AS':'

SELECT ASCII(N'99') AS '99',ASCII(N':9') AS':9'

DECLARE @T TABLE(NAME NVARCHAR(2))
INSERT @T SELECT N'99' UNION ALL SELECT N'9:'

SELECT * FROM @T WHERE NAME>N'9:'


DECLARE @TA TABLE(NAME VARCHAR(2))
INSERT @TA SELECT '99' UNION ALL SELECT '9:'

SELECT * FROM @TA WHERE NAME>':9'

/*99 9:
----------- -----------
57 57

(所影响的行数为 1 行)

9 :
----------- -----------
57 58

(所影响的行数为 1 行)

99 :9
----------- -----------
57 58

(所影响的行数为 1 行)


(所影响的行数为 2 行)

NAME
----
99

(所影响的行数为 1 行)


(所影响的行数为 2 行)

NAME
----
99
9:

(所影响的行数为 2 行)


*/
select case when '99'>'98' then 1 else 0 end

/*
-----------
1

(所影响的行数为 1 行)

*/


UNICODE类型比较和非UNICODE类型的比较貌似较复杂,没想像中这么简单
kyouken2007 2010-10-03
  • 打赏
  • 举报
回复
总拿SELECT ASCII('9:'),SELECT ASCII('99')说什么事,我是要字符串比大小。
kyouken2007 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zsh0809 的回复:]

SQL code
SELECT ASCII('9A')
SELECT ASCII('99')

-----------
57

(1 row(s) affected)

-----------
57

(1 row(s) affected)
[/Quote]

字符串比较大小是只取第一个字符比较还是逐个字符比较?????
「已注销」 2010-10-03
  • 打赏
  • 举报
回复
SELECT ASCII('9A')
SELECT ASCII('99')

-----------
57

(1 row(s) affected)

-----------
57

(1 row(s) affected)
「已注销」 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 kyouken2007 的回复:]

引用 9 楼 zsh0809 的回复:

“9:”用ascii转换后,只是取9的ascii码值,即57,当然是小于99的。


按你这个意思“98”=“99”
“9A”<“99”???
你没搞错吧??你颠覆了我近10年的经验。。。。
[/Quote]
你后面的99也取ascii了?
select ascii(99) 等价于 select ascii(9) ,系统只会取第一码。
kyouken2007 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zsh0809 的回复:]

“9:”用ascii转换后,只是取9的ascii码值,即57,当然是小于99的。
[/Quote]

按你这个意思“98”=“99”
“9A”<“99”???
你没搞错吧??你颠覆了我近10年的经验。。。。
「已注销」 2010-10-03
  • 打赏
  • 举报
回复
“9:”用ascii转换后,只是取9的ascii码值,即57,当然是小于99的。
kyouken2007 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zsh0809 的回复:]

上面是ASCII表,ascii码只用来表示单个独立字符的,哪来的99呢,你把99来转换ascii,系统只默认取
第一个字符处理罢了。
[/Quote]

请问在我所描述的环境中,为什么(“9:”>=”99”)返回的是false
「已注销」 2010-10-03
  • 打赏
  • 举报
回复
上面是ASCII表,ascii码只用来表示单个独立字符的,哪来的99呢,你把99来转换ascii,系统只默认取
第一个字符处理罢了。
「已注销」 2010-10-03
  • 打赏
  • 举报
回复
常用ASCII码表(方便查找)

键盘
ASCII码

键盘
ASCII码

键盘
ASCII码

键盘
ASCII码
ESC 27 7 55 O 79 g 103
SPACE 32 8 56 P 80 h 104
! 33 9 57 Q 81 i 105
" 34 : 58 R 82 j 106
# 35 ; 59 S 83 k 107
$ 36 < 60 T 84 l 108
% 37 = 61 U 85 m 109
& 38 > 62 V 86 n 110
' 39 ? 63 W 87 o 111
( 40 @ 64 X 88 p 112
) 41 A 65 Y 89 q 113
* 42 B 66 Z 90 r 114
+ 43 C 67 [ 91 s 115
' 44 D 68 \ 92 t 116
- 45 E 69 ] 93 u 117
. 46 F 70 ^ 94 v 118
/ 47 G 71 _ 95 w 119
0 48 H 72 ` 96 x 120
1 49 I 73 a 97 y 121
2 50 J 74 b 98 z 122
3 51 K 75 c 99 { 123
4 52 L 76 d 100 | 124
5 53 M 77 e 101 } 125
6 54 N 78 f 102 ~ 126

另外2个特殊ASCII码:回车=13,换行=10
kyouken2007 2010-10-03
  • 打赏
  • 举报
回复
我的排序规则当然是希望他按照 ASCII码 比较了,
希望的结果是:

“99”>”98”
“9:”>”99”


另外,我不理解为什么SELECT ASCII('99')的结果是57。。
SQL77 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kyouken2007 的回复:]
我是这么认为的,但是结果为什么跟我预期的相反??
[/Quote]
你的排序规则是什么,
SELECT ASCII('99') AS '99',ASCII('9:') AS'9:'

SELECT ASCII('9') AS '9',ASCII(':') AS':'

/*

99 9:
----------- -----------
57 57

(所影响的行数为 1 行)

9 :
----------- -----------
57 58

(所影响的行数为 1 行)

这两种刚好相等了

kyouken2007 2010-10-03
  • 打赏
  • 举报
回复
我是这么认为的,但是结果为什么跟我预期的相反??
SQL77 2010-10-03
  • 打赏
  • 举报
回复
SELECT ASCII('9') AS '9',ASCII(':') AS':'
/*
9 :
----------- -----------
57 58

(所影响的行数为 1 行)


字符比较大小是按ASCII码来逐个比较的
加载更多回复(1)

662

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧