难题:如何SQL实现access查询时区分大小写,不区分全半角? [在线急等]

时间:2021-07-27 04:21:39
如题!
strcomp可实现二进制比较,但是会同时区分大小写和全半角;
直接= <> 会不区分全半角,但也会不区分大小写.

请高手帮忙,在线等,谢谢!~

26 个解决方案

#1


在Jet SQL查询中,如何区分大小写?

原文:http://access911.net/fixhtm/73FAB31E14DC.htm


问题:



 sql问题!
在写查询的时候如何区分大小写
注意:注意:
情况分两种,一种是我在 查询 设计器里面直接作
另一种是在vbe界面里面用 docmd.runsql "select * from where a like '*ddEE*'"

注意,这里的 like '*ddEE*' 是要求区分大小写的, 'ddee' 或者 'DDee' 不允许出现在查询结果中。
 

 


方法一:



 请参考 StrComp inStr 这两个函数。
在LIKE操作中一般使用INSTR函数,该函数的说明请参考

InStr 函数
返回 Variant (Long),指定一字符串在另一字符串中最先出现的位置。

语法 

InStr([start, ]string1, string2[, compare])

InStr 函数的语法具有下面的参数:

部分 说明 
start 可选参数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个字符的位置开始。如果 start 包含 Null,将发生错误。如果指定了 compare 参数,则一定要有 start 参数。 
string1 必要参数。接受搜索的字符串表达式。 
string2 必要参数。被搜索的字符串表达式。 
Compare 可选参数。指定字符串比较。如果 compare 是 Null,将发生错误。如果省略 compare,Option Compare 的设置将决定比较的类型。指定一个有效的LCID (LocaleID) 以在比较中使用与区域有关的规则。 



设置

compare 参数设置为:

常数 值 描述 
vbUseCompareOption -1 使用Option Compare 语句设置执行一个比较。 
vbBinaryCompare 0 执行一个二进制比较。 
vbTextCompare 1 执行一个按照原文的比较。 
vbDatabaseCompare 2 仅适用于Microsoft Access,执行一个基于数据库中信息的比较。 



返回值

如果 InStr返回 
string1 为零长度 0 
string1 为 Null Null 
string2 为零长度 Start 
string2 为 Null Null 
string2 找不到 0 
在 string1 中找到string2  找到的位置 
start > string2 0 



说明

InStrB 函数作用于包含在字符串中的字节数据。所以 InStrB 返回的是字节位置,而不是字符位置。
 


一般可以这样:
select * from tablename where instr(1,fieldname,"字符",1)>0 



 

 


方法二:



 以下为MS的回答:
根据我的理解和经验,LIKE语句是不支持区分大小写的。但是,也许我们可以通过其它的方法来在一定程度上实现您所需要的功能。只能说是一定程度上,因为毕竟不可能像LIKE语句那么灵活的实现区分大小写

 
比如说:您希望实现类似LIKE “b*” 的功能,并且希望他是区分大小写的,我们可以这样写QUERY语句:

SELECT Customers.Name

FROM Customers

WHERE (((Asc([city]))>Asc("A") And (Asc([city]))<Asc("C")));

在这个语句中,我们通过 ASC 返回字符串首字母的ASCII码,然后再进行判断。

 

如果你希望能够实现类似于LIKE “abc*”的功能,并且希望他是区分大小写的,我们可以这样考虑QUERY语句:

SELECT Customers.City

FROM Customers

WHERE (((StrComp([city],"abc",0))=1)) AND (((Asc([city]))>Asc("a") And (Asc([city]))<Asc("c")));

 

通过上面的例子您可以看出,虽然我们能够通过变通的方法来实现查询中对于大小写的区分,但是相对来说是比较复杂的,还可能会造成一定性能的影响。并且如果您不能够正确判断所有可能出现的情况的话,查询得到的结果可能会是不正确的(比如,我希望实现LIKE “?a??A*”就非常难以判断了)。

更加详细的说明和帮助您可以参看
ACC2000: How to Return Case-Sensitive Matches in Queries
http://support.microsoft.com/?id=209674 
 

#2


SELECT * FROM 表 WHERE instr(1,fieldname,"g",0)>0

#3


SELECT * FROM 表 WHERE instr(1,fieldname,"大小写字符",0)>0 

#4


最主要的是全半角,将字符全部转换为大(ucase)OR 小写(lcase)就可以了嘛。

#5


最主要的是全半角,将字符全部转换为大(ucase)OR 小写(lcase)就可以解决大小写问题。

#6


按照911的方法,用参数1(vbTextCompare),下面的语句我的电脑测试不成功
select * from tablename where instr(1,fieldname,"字符",1)>0 


需改为参数0(执行一个二进制比较)

select * from tablename where instr(1,fieldname,"字符",0)>0 

#7


谢谢各位;

请各位看清楚我的问题是:
不区分全半角;但同时,区分大小写!

再说仔细点,我想查询某个表中是否有AbC之外的非法数据;
因此abc是非法数据,但AbC是合法数据, instr估计是用不上. 先试试,谢谢!

WWWWA  说的是不区分大小写的情况.

下午一直上不了csdn,不好意思!

#8


我写了个通用函数判断是否有非法值;
其中有两个参数:是否区分大小写 和 是否区分全半角

两两组合有四种情况,现在只有 不区分全半角但区分大小写 未实现; 其他三种都已经实现成功.

#9


区分大小写:是整个记录内容(AbC)还是拆分为单个字母时(A、b、C)?

#10


整个内容. 就是abc时ABC也满足,AbC也满足

#11


没人会么?

#12


引用 10 楼 boythl 的回复:
整个内容. 就是abc时ABC也满足,AbC也满足


你是区分大小写,还是不区分大小写 

#13


Function Test(StrWhere As String)
' StrWhere 为条件参数
'示例: Test "g" 列举T1表中F1字段中全角半角中"g"的数据,但不包括大写G

Dim Rs As New ADODB.Recordset
Dim Str As String
Dim I As Integer
Dim IntLen As Integer
Dim Tem As String
Rs.Open "select * from T1", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
Do While Not Rs.EOF
 Str = ""
 IntLen = Len(Rs.Fields("F1"))
 Tem = Rs.Fields("F1")
 For I = 1 To IntLen
   If Asc(Mid(Tem, I, 1)) < 0 Then
      Str = Str & Chr(Asc(Mid(Tem, I, 1)) + 23680)
    Else
     Str = Str & Mid(Tem, I, 1)

    End If

 Next
 
 If InStr(1, Str, StrWhere, vbBinaryCompare) > 0 Then
    
    Debug.Print Tem
  End If
  
  Rs.MoveNext
  
  Loop
  

Rs.Close
 
 

End Function

#14


to ewang11 :
你这是代码实现了,我想通过sql来实现.  用代码的话我就不用来问了.
不区分全半角, 区分大小写. 上面的例子举错了,抱歉!

ABC 只匹配ABC, 不匹配Abc/aBC; 但匹配ABC ABC. 见标题,谢谢!

#15


有点糊涂了,到底你需要什么样的结果?
abc aBC abC
Abc ABC ABc
匹配哪些?

#16


可能举例举乱了. 就看标题吧. 
符合标题就可以了.

abc aBC abC 
Abc ABC ABc  
ABC ABC aBC
比如我想搜ABC,那ABC ABC ABC 都满足.其他的不满足   区分大小写,不区分全半角.

#17


引用 10 楼 boythl 的回复:
整个内容. 就是abc时ABC也满足,AbC也满足


这个例子是回答你说的整句匹配还是单字符匹配时举的,不符合标题,是错误的.

#18


引用 16 楼 boythl 的回复:
可能举例举乱了. 就看标题吧.
符合标题就可以了.

abc aBC abC
Abc ABC ABc
ABC ABC aBC
比如我想搜ABC,那ABC ABC ABC 都满足.其他的不满足区分大小写,不区分全半角.

也就是说字母不区分全半角,空格不区分全半角?

#19


是这样子的. 帮我想想办法吧. 谢谢啦!
若实在不行就只好代码解决了. 

#20


不用考虑所有的全半角, 只字母和数字就可以了. 符号都不用考虑

#21


筛选AbC的记录(区分大小写,不分全角半角)

SELECT T1.ID, T1.F1
FROM T1
WHERE instr(1,replace(replace(REPLACE(F1,"A","A",1,-1,0),"b","b",1,-1,0),"C","C",1,-1,0),"AbC",0)>0;

#22


引用 21 楼 ewang11 的回复:
筛选AbC的记录(区分大小写,不分全角半角) 

SELECT T1.ID, T1.F1 
FROM T1 
WHERE instr(1,replace(replace(REPLACE(F1,"A","A",1,-1,0),"b","b",1,-1,0),"C","C",1,-1,0),"AbC",0)>0; 


谢谢您为我提供解决问题的一种方法.

这样未免太刻板了吧?
若我字符串100个字,我岂非得嵌套100个replace,再考虑26个全角大写英文字母,26个全角小写字母,10个全角数字....

谢谢!提前祝两位大虾周末愉快,周一见!  为感谢两位的帮助,我结贴时会加分到100.

#23


用代码生成临时查询比较方面一点

#24


若我字符串100个字,我岂非得嵌套100个replace,再考虑26个全角大写英文字母,26个全角小写字母,10个全角数字.... 

这种情况只有用代码了,将所有全角->半角,去掉空格,再做判断

#25


呃. 我就是懒得用代码才想sql能否实现.  看样子还是不行的呀.
谢谢两位的帮助!JT

#26


取ASCII行么?逐一取ASCII,再用ASCII比较,我知道这能解决大小写问题,但是不知道能否解决全半角问题

#1


在Jet SQL查询中,如何区分大小写?

原文:http://access911.net/fixhtm/73FAB31E14DC.htm


问题:



 sql问题!
在写查询的时候如何区分大小写
注意:注意:
情况分两种,一种是我在 查询 设计器里面直接作
另一种是在vbe界面里面用 docmd.runsql "select * from where a like '*ddEE*'"

注意,这里的 like '*ddEE*' 是要求区分大小写的, 'ddee' 或者 'DDee' 不允许出现在查询结果中。
 

 


方法一:



 请参考 StrComp inStr 这两个函数。
在LIKE操作中一般使用INSTR函数,该函数的说明请参考

InStr 函数
返回 Variant (Long),指定一字符串在另一字符串中最先出现的位置。

语法 

InStr([start, ]string1, string2[, compare])

InStr 函数的语法具有下面的参数:

部分 说明 
start 可选参数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个字符的位置开始。如果 start 包含 Null,将发生错误。如果指定了 compare 参数,则一定要有 start 参数。 
string1 必要参数。接受搜索的字符串表达式。 
string2 必要参数。被搜索的字符串表达式。 
Compare 可选参数。指定字符串比较。如果 compare 是 Null,将发生错误。如果省略 compare,Option Compare 的设置将决定比较的类型。指定一个有效的LCID (LocaleID) 以在比较中使用与区域有关的规则。 



设置

compare 参数设置为:

常数 值 描述 
vbUseCompareOption -1 使用Option Compare 语句设置执行一个比较。 
vbBinaryCompare 0 执行一个二进制比较。 
vbTextCompare 1 执行一个按照原文的比较。 
vbDatabaseCompare 2 仅适用于Microsoft Access,执行一个基于数据库中信息的比较。 



返回值

如果 InStr返回 
string1 为零长度 0 
string1 为 Null Null 
string2 为零长度 Start 
string2 为 Null Null 
string2 找不到 0 
在 string1 中找到string2  找到的位置 
start > string2 0 



说明

InStrB 函数作用于包含在字符串中的字节数据。所以 InStrB 返回的是字节位置,而不是字符位置。
 


一般可以这样:
select * from tablename where instr(1,fieldname,"字符",1)>0 



 

 


方法二:



 以下为MS的回答:
根据我的理解和经验,LIKE语句是不支持区分大小写的。但是,也许我们可以通过其它的方法来在一定程度上实现您所需要的功能。只能说是一定程度上,因为毕竟不可能像LIKE语句那么灵活的实现区分大小写

 
比如说:您希望实现类似LIKE “b*” 的功能,并且希望他是区分大小写的,我们可以这样写QUERY语句:

SELECT Customers.Name

FROM Customers

WHERE (((Asc([city]))>Asc("A") And (Asc([city]))<Asc("C")));

在这个语句中,我们通过 ASC 返回字符串首字母的ASCII码,然后再进行判断。

 

如果你希望能够实现类似于LIKE “abc*”的功能,并且希望他是区分大小写的,我们可以这样考虑QUERY语句:

SELECT Customers.City

FROM Customers

WHERE (((StrComp([city],"abc",0))=1)) AND (((Asc([city]))>Asc("a") And (Asc([city]))<Asc("c")));

 

通过上面的例子您可以看出,虽然我们能够通过变通的方法来实现查询中对于大小写的区分,但是相对来说是比较复杂的,还可能会造成一定性能的影响。并且如果您不能够正确判断所有可能出现的情况的话,查询得到的结果可能会是不正确的(比如,我希望实现LIKE “?a??A*”就非常难以判断了)。

更加详细的说明和帮助您可以参看
ACC2000: How to Return Case-Sensitive Matches in Queries
http://support.microsoft.com/?id=209674 
 

#2


SELECT * FROM 表 WHERE instr(1,fieldname,"g",0)>0

#3


SELECT * FROM 表 WHERE instr(1,fieldname,"大小写字符",0)>0 

#4


最主要的是全半角,将字符全部转换为大(ucase)OR 小写(lcase)就可以了嘛。

#5


最主要的是全半角,将字符全部转换为大(ucase)OR 小写(lcase)就可以解决大小写问题。

#6


按照911的方法,用参数1(vbTextCompare),下面的语句我的电脑测试不成功
select * from tablename where instr(1,fieldname,"字符",1)>0 


需改为参数0(执行一个二进制比较)

select * from tablename where instr(1,fieldname,"字符",0)>0 

#7


谢谢各位;

请各位看清楚我的问题是:
不区分全半角;但同时,区分大小写!

再说仔细点,我想查询某个表中是否有AbC之外的非法数据;
因此abc是非法数据,但AbC是合法数据, instr估计是用不上. 先试试,谢谢!

WWWWA  说的是不区分大小写的情况.

下午一直上不了csdn,不好意思!

#8


我写了个通用函数判断是否有非法值;
其中有两个参数:是否区分大小写 和 是否区分全半角

两两组合有四种情况,现在只有 不区分全半角但区分大小写 未实现; 其他三种都已经实现成功.

#9


区分大小写:是整个记录内容(AbC)还是拆分为单个字母时(A、b、C)?

#10


整个内容. 就是abc时ABC也满足,AbC也满足

#11


没人会么?

#12


引用 10 楼 boythl 的回复:
整个内容. 就是abc时ABC也满足,AbC也满足


你是区分大小写,还是不区分大小写 

#13


Function Test(StrWhere As String)
' StrWhere 为条件参数
'示例: Test "g" 列举T1表中F1字段中全角半角中"g"的数据,但不包括大写G

Dim Rs As New ADODB.Recordset
Dim Str As String
Dim I As Integer
Dim IntLen As Integer
Dim Tem As String
Rs.Open "select * from T1", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
Do While Not Rs.EOF
 Str = ""
 IntLen = Len(Rs.Fields("F1"))
 Tem = Rs.Fields("F1")
 For I = 1 To IntLen
   If Asc(Mid(Tem, I, 1)) < 0 Then
      Str = Str & Chr(Asc(Mid(Tem, I, 1)) + 23680)
    Else
     Str = Str & Mid(Tem, I, 1)

    End If

 Next
 
 If InStr(1, Str, StrWhere, vbBinaryCompare) > 0 Then
    
    Debug.Print Tem
  End If
  
  Rs.MoveNext
  
  Loop
  

Rs.Close
 
 

End Function

#14


to ewang11 :
你这是代码实现了,我想通过sql来实现.  用代码的话我就不用来问了.
不区分全半角, 区分大小写. 上面的例子举错了,抱歉!

ABC 只匹配ABC, 不匹配Abc/aBC; 但匹配ABC ABC. 见标题,谢谢!

#15


有点糊涂了,到底你需要什么样的结果?
abc aBC abC
Abc ABC ABc
匹配哪些?

#16


可能举例举乱了. 就看标题吧. 
符合标题就可以了.

abc aBC abC 
Abc ABC ABc  
ABC ABC aBC
比如我想搜ABC,那ABC ABC ABC 都满足.其他的不满足   区分大小写,不区分全半角.

#17


引用 10 楼 boythl 的回复:
整个内容. 就是abc时ABC也满足,AbC也满足


这个例子是回答你说的整句匹配还是单字符匹配时举的,不符合标题,是错误的.

#18


引用 16 楼 boythl 的回复:
可能举例举乱了. 就看标题吧.
符合标题就可以了.

abc aBC abC
Abc ABC ABc
ABC ABC aBC
比如我想搜ABC,那ABC ABC ABC 都满足.其他的不满足区分大小写,不区分全半角.

也就是说字母不区分全半角,空格不区分全半角?

#19


是这样子的. 帮我想想办法吧. 谢谢啦!
若实在不行就只好代码解决了. 

#20


不用考虑所有的全半角, 只字母和数字就可以了. 符号都不用考虑

#21


筛选AbC的记录(区分大小写,不分全角半角)

SELECT T1.ID, T1.F1
FROM T1
WHERE instr(1,replace(replace(REPLACE(F1,"A","A",1,-1,0),"b","b",1,-1,0),"C","C",1,-1,0),"AbC",0)>0;

#22


引用 21 楼 ewang11 的回复:
筛选AbC的记录(区分大小写,不分全角半角) 

SELECT T1.ID, T1.F1 
FROM T1 
WHERE instr(1,replace(replace(REPLACE(F1,"A","A",1,-1,0),"b","b",1,-1,0),"C","C",1,-1,0),"AbC",0)>0; 


谢谢您为我提供解决问题的一种方法.

这样未免太刻板了吧?
若我字符串100个字,我岂非得嵌套100个replace,再考虑26个全角大写英文字母,26个全角小写字母,10个全角数字....

谢谢!提前祝两位大虾周末愉快,周一见!  为感谢两位的帮助,我结贴时会加分到100.

#23


用代码生成临时查询比较方面一点

#24


若我字符串100个字,我岂非得嵌套100个replace,再考虑26个全角大写英文字母,26个全角小写字母,10个全角数字.... 

这种情况只有用代码了,将所有全角->半角,去掉空格,再做判断

#25


呃. 我就是懒得用代码才想sql能否实现.  看样子还是不行的呀.
谢谢两位的帮助!JT

#26


取ASCII行么?逐一取ASCII,再用ASCII比较,我知道这能解决大小写问题,但是不知道能否解决全半角问题