MS Access 区分大小写的查询给出不正确的结果
MS Access Case sensitive query giving incorrect result
为什么这些查询会给出不同的结果? Reference 是一个单字符列,我希望有一个结果给出大写和小写字母 'r'.
的计数
Select SUM(IIF(StrComp([REFERENCE],'R',0) = 0, 1, 0)) AS BIG_R,
SUM(IIF(StrComp([REFERENCE],'r',0) = 0, 1, 0)) AS LITTLE_R
From [SYMREF]
Where [PROGRAM] = 'SOMEPROGRAM'
结果是 BIG_R 和 LITTLE_R 相同并且等于 BIG_R 的
的计数
然而,
Select SUM(IIF(StrComp([REFERENCE],'r',0) = 0, 1, 0)) AS LITTE_R,
SUM(IIF(StrComp([REFERENCE],'R',0) = 0, 1, 0)) AS BIG_R
From [SYMREF]
Where [PROGRAM] = 'SOMEPROGRAM'
再次 LITTLE_R 和 BIG_R 相同,但这次它们等于 LITTLE_R 的
的计数
这看起来像是 MS Access 处理此类查询的方式中的错误,或者我在这里遗漏了什么?
Access(或者更确切地说是 JetEngine)认为 StrComp
使用相同的参数被调用了两次,并优化了两次调用之一。
解决方法是比较 ASCII 字符值(Asc("r") = 114
、Asc("R") = 82
):
Select
SUM(IIF(Asc([REFERENCE]) = Asc('R'), 1, 0)) AS BIG_R,
SUM(IIF(Asc([REFERENCE]) = Asc('r'), 1, 0)) AS LITTLE_R
From [SYMREF]
Where [PROGRAM] = 'SOMEPROGRAM'
另一种解决方法:
Select SUM(IIF(StrComp([REFERENCE],Chr$(82),0) = 0, 1, 0)) AS BIG_R,
SUM(IIF(StrComp([REFERENCE],Chr$(114),0) = 0, 1, 0)) AS LITTLE_R
From [SYMREF]
Where [PROGRAM] = 'SOMEPROGRAM'
这里 StrComp
的两个输入明显不同。所以,第二个调用没有优化掉。
为什么这些查询会给出不同的结果? Reference 是一个单字符列,我希望有一个结果给出大写和小写字母 'r'.
的计数Select SUM(IIF(StrComp([REFERENCE],'R',0) = 0, 1, 0)) AS BIG_R,
SUM(IIF(StrComp([REFERENCE],'r',0) = 0, 1, 0)) AS LITTLE_R
From [SYMREF]
Where [PROGRAM] = 'SOMEPROGRAM'
结果是 BIG_R 和 LITTLE_R 相同并且等于 BIG_R 的
的计数然而,
Select SUM(IIF(StrComp([REFERENCE],'r',0) = 0, 1, 0)) AS LITTE_R,
SUM(IIF(StrComp([REFERENCE],'R',0) = 0, 1, 0)) AS BIG_R
From [SYMREF]
Where [PROGRAM] = 'SOMEPROGRAM'
再次 LITTLE_R 和 BIG_R 相同,但这次它们等于 LITTLE_R 的
的计数这看起来像是 MS Access 处理此类查询的方式中的错误,或者我在这里遗漏了什么?
Access(或者更确切地说是 JetEngine)认为 StrComp
使用相同的参数被调用了两次,并优化了两次调用之一。
解决方法是比较 ASCII 字符值(Asc("r") = 114
、Asc("R") = 82
):
Select
SUM(IIF(Asc([REFERENCE]) = Asc('R'), 1, 0)) AS BIG_R,
SUM(IIF(Asc([REFERENCE]) = Asc('r'), 1, 0)) AS LITTLE_R
From [SYMREF]
Where [PROGRAM] = 'SOMEPROGRAM'
另一种解决方法:
Select SUM(IIF(StrComp([REFERENCE],Chr$(82),0) = 0, 1, 0)) AS BIG_R,
SUM(IIF(StrComp([REFERENCE],Chr$(114),0) = 0, 1, 0)) AS LITTLE_R
From [SYMREF]
Where [PROGRAM] = 'SOMEPROGRAM'
这里 StrComp
的两个输入明显不同。所以,第二个调用没有优化掉。