当前位置: 首页 > 面试题库 >

SQL Server通配符字符范围(例如[AD])如何与区分大小写的排序规则一起使用?

孔嘉茂
2023-03-14
问题内容

谁能解释通配符字符范围(例如[AD])如何使用区分大小写的排序规则的规则?

我本以为以下

WHERE CharColumn LIKE '[A-D]%';

将仅返回以大写A,B,C或D开头的记录,并排除以小写a,b,c或d开头的记录。

但是,实际上,它似乎返回以大写字母A开头的记录,但也返回以B或b,C或c以及D或d开头的记录。就像范围的第一个字符区分大小写,而范围中的其余字符也不区分大小写。

另一方面,以下

WHERE CharColumn LIKE '[ABCD]%';

仅返回与上壳体的开始记录,B,C或D.然而,我会想到[AD]将相当于[ABCD]。

在SQL Server 2005和SQL Server 2008 R2中,我得到相同的结果。

示例:(
使用SQL Server 2008行构造函数编写的插入语句具有紧凑性。如果每个值都具有自己的插入语句,则该脚本将在SQL Server 2005中运行)

CREATE TABLE #TEST_LIKE_Patterns
    ( 
        ID INT IDENTITY(1,1),
        CharColumn VARCHAR(100) COLLATE Latin1_General_CS_AS
    );

--------------
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('aaa'), ('aAA'), ('AAA'), ('Aaa');
--------------    
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('bbb'), ('bBB'), ('BBB'), ('Bbb');
--------------
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('ccc'), ('cCC'), ('CCC'), ('Ccc');
--------------    
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('ddd'), ('dDD'), ('DDD'), ('Ddd');
--------------    
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('eee'), ('eEE'), ('EEE'), ('Eee');
--------------    
INSERT INTO #TEST_LIKE_Patterns (CharColumn)
VALUES ('fff'), ('fFF'), ('FFF'), ('Fff');
--------------

-- Raw Data:
SELECT *
FROM #TEST_LIKE_Patterns;

SELECT *
FROM #TEST_LIKE_Patterns
WHERE CharColumn LIKE '[A-D]%';

-- Results:
/*
ID   CharColumn
--------------
3    AAA
4    Aaa
5    bbb
6    bBB
7    BBB
8    Bbb
9    ccc
10   cCC
11   CCC
12   Ccc
13   ddd
14   dDD
15   DDD
16   Ddd
*/


SELECT *
FROM #TEST_LIKE_Patterns
WHERE CharColumn LIKE '[ABCD]%';

-- Results:
/*
ID   CharColumn
    --------------
3    AAA
4    Aaa
7    BBB
8    Bbb
11   CCC
12   Ccc
15   DDD
16   Ddd
*/

问题答案:

您需要按照Elias
Hossain博士的回答中
所示进行二进制排序。

解释是,模式语法中的范围适用于排序规则排序规则。

从BOL

在范围搜索中,范围中包含的字符可能会根据归类的排序规则而有所不同。

所以

;WITH T(C) AS
(
SELECT 'A' UNION ALL
SELECT 'B' UNION ALL
SELECT 'C' UNION ALL
SELECT 'D' UNION ALL
select 'a' union all
select 'b' union all
select 'c' union all
select 'd'
)
SELECT *
FROM T
ORDER BY C COLLATE Latin1_General_CS_AS

退货

C
----
a
A
b
B
c
C
d
D

因此,该范围A-D排除a但包括CS归类下的其他3个小写字母。



 类似资料:
  • 问题内容: 使用PATINDEX和区分大小写的排序规则来搜索字符串中的大写字母,我注意到这没有产生期望的结果: 但是,指定每个字母AZ可以: 我对第一种情况下使用范围的理解不正确吗?为什么这样的行为? 问题答案: 不幸的是,范围运算符有点可笑。AZ的字母范围是: 即,小写字符紧接在大写字母之前。这也很有趣,因为如果要同时处理大小写字符,则在区分大小写的排序规则中,范围AZ排除小写字母a。 关于范围

  • 问题内容: MySQL中是否有任何支持区分大小写的排序规则类型。我在MySQL中使用了所有类型的排序规则,它们的名称末尾都带有_ci,因此它们是不区分大小写的排序规则。 问题答案: 根据MySQL手册http://dev.mysql.com/doc/refman/5.0/en/charset- mysql.html, 您应该能够将排序规则设置为区分大小写。您可以通过执行查询来获取归类列表 经过一点

  • 如何使通配符不区分大小写? https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html

  • 问题内容: 我有一个查询sqlite3数据库,该数据库提供了已排序的数据。数据是根据“名称”列进行排序的。现在当我执行查询时 它提供了这样的数据。 表示正在考虑区分大小写的内容。我想要的方式如下 那么,对于必要的结果,我应该在sqlite3数据库中进行哪些更改? 相关如何在字符串比较时将Sqlite3设置为不区分大小写? 问题答案: SQLite数据类型文档讨论了用户定义的排序规则序列。具体来说,

  • 问题内容: 我正在尝试为其中一个根据您的回答做出响应的程序编写代码。我想这样做,以便某些变量不区分大小写。例如,如果我的变量等于我希望它也等于。那可能吗? 到目前为止,这是我的代码: 我不想为每个答案都设置2种情况,其中一种是大写,另一种是小写。 稍微偏离主题的问题。如何关闭扫描仪的资源泄漏? 问题答案: 值得一提: 或简单地使用:

  • 需要制作一个密码程序,用户在开始时设置密码,在程序停止前可以输入密码3次。该程序不能区分大小写。 程序按预期打印,但不区分大小写