SQL Server通配符字符范围(例如[A-D])如何处理区分大小写的排序规则?

前端之家收集整理的这篇文章主要介绍了SQL Server通配符字符范围(例如[A-D])如何处理区分大小写的排序规则?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
任何人都可以解释通配符字符范围的规则,例如[A-D],如何使用区分大小写的排序规则?

我会想到以下几点

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

只返回以大写字母A,B,C或D开头的记录,并排除以小写字母a,b,c或d开头的记录.

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

另一方面,以下

  1. WHERE CharColumn LIKE '[ABCD]%';

只返回以大写字母A,C或D开头的记录.但我认为[A-D]相当于[ABCD].

我在sql Server 2005和sql Server 2008 R2中获得了相同的结果.

例:
(插入使用sql Server 2008行构造函数编写的语句,以实现紧凑性.如果每个值都有自己的insert语句,则脚本将在sql Server 2005中运行)

  1. CREATE TABLE #TEST_LIKE_Patterns
  2. (
  3. ID INT IDENTITY(1,1),CharColumn VARCHAR(100) COLLATE Latin1_General_CS_AS
  4. );
  5.  
  6. --------------
  7. INSERT INTO #TEST_LIKE_Patterns (CharColumn)
  8. VALUES ('aaa'),('aAA'),('AAA'),('Aaa');
  9. --------------
  10. INSERT INTO #TEST_LIKE_Patterns (CharColumn)
  11. VALUES ('bbb'),('bBB'),('BBB'),('Bbb');
  12. --------------
  13. INSERT INTO #TEST_LIKE_Patterns (CharColumn)
  14. VALUES ('ccc'),('cCC'),('CCC'),('Ccc');
  15. --------------
  16. INSERT INTO #TEST_LIKE_Patterns (CharColumn)
  17. VALUES ('ddd'),('dDD'),('DDD'),('Ddd');
  18. --------------
  19. INSERT INTO #TEST_LIKE_Patterns (CharColumn)
  20. VALUES ('eee'),('eEE'),('EEE'),('Eee');
  21. --------------
  22. INSERT INTO #TEST_LIKE_Patterns (CharColumn)
  23. VALUES ('fff'),('fFF'),('FFF'),('Fff');
  24. --------------
  25.  
  26. -- Raw Data:
  27. SELECT *
  28. FROM #TEST_LIKE_Patterns;
  29.  
  30. SELECT *
  31. FROM #TEST_LIKE_Patterns
  32. WHERE CharColumn LIKE '[A-D]%';
  33.  
  34. -- Results:
  35. /*
  36. ID CharColumn
  37. --------------
  38. 3 AAA
  39. 4 Aaa
  40. 5 bbb
  41. 6 bBB
  42. 7 BBB
  43. 8 Bbb
  44. 9 ccc
  45. 10 cCC
  46. 11 CCC
  47. 12 Ccc
  48. 13 ddd
  49. 14 dDD
  50. 15 DDD
  51. 16 Ddd
  52. */
  53.  
  54.  
  55. SELECT *
  56. FROM #TEST_LIKE_Patterns
  57. WHERE CharColumn LIKE '[ABCD]%';
  58.  
  59. -- Results:
  60. /*
  61. ID CharColumn
  62. --------------
  63. 3 AAA
  64. 4 Aaa
  65. 7 BBB
  66. 8 Bbb
  67. 11 CCC
  68. 12 Ccc
  69. 15 DDD
  70. 16 Ddd
  71. */

解决方法

您需要二进制排序规则,如 Md. Elias Hossain’s answer所示.

解释是模式语法中的范围可以解决排序规则排序顺序规则.

From BOL

In range searches,the characters included in the range may vary
depending on the sorting rules of the collation.

@H_301_35@

所以

  1. ;WITH T(C) AS
  2. (
  3. SELECT 'A' UNION ALL
  4. SELECT 'B' UNION ALL
  5. SELECT 'C' UNION ALL
  6. SELECT 'D' UNION ALL
  7. select 'a' union all
  8. select 'b' union all
  9. select 'c' union all
  10. select 'd'
  11. )
  12. SELECT *
  13. FROM T
  14. ORDER BY C COLLATE Latin1_General_CS_AS

返回

  1. C
  2. ----
  3. a
  4. A
  5. b
  6. B
  7. c
  8. C
  9. d
  10. D

因此,范围A-D排除了a但包括CS整理下的其他3个小写字母.

猜你在找的MsSQL相关文章