SQL:使用<=和> =将字符串与通配符进行比较

时间:2018-09-10 07:49:35

标签: sql sql-server wildcard string-comparison

假设我有一个看起来像这样的表:

Id  |  Name  |  Age
=====================
1   |  Jose  | 19

2   |  Yolly | 26

20  |  Abby  | 3

29  |  Tara  | 4

我的查询语句是:

1)Select * from thisTable where Name <= '*Abby';    它返回0行

2)Select * from thisTable where Name <= 'Abby';    返回带有Abby的行

3)Select * from thisTable where Name >= 'Abby';    返回所有行// //第1-4行

4)Select * from thisTable where Name >= '*Abby';    返回所有行; //第1-4行

5)Select * from thisTable where Name >= '*Abby' and Name <= "*Abby";    返回0行。

6)Select * from thisTable where Name >= 'Abby' and Name <= 'Abby';    返回Abby的行;

我的问题:为什么我得到这些结果?通配符如何影响查询结果?如果条件为Name <= '*Abby',为什么我没有得到任何结果?

5 个答案:

答案 0 :(得分:3)

通配符仅在您使用Ezvcard.parse(vCardFile).first()起草者时被解释。

因此,当您尝试与字符串进行比较时,将按字面意义对待它。因此,在比较中,按字典顺序使用。

1)LIKE之前没有字母,因此您没有返回任何行。

2)*是字母表中的第一个字母,因此其余的名称​​更大,然后是Abby,只有Abby等于自己。

3)与2)相反

4)参见1)

5)参见1)

6)此条件等效于A

答案 1 :(得分:2)

通配符用于替换字符串中的任何其他字符。它们与LIKE子句中的SQL WHERE运算符结合使用。例如。

Select * from thisTable WHERE name LIKE '%Abby%'

这将在字符串中的任何位置返回任何带有Abby的值。

请查看此链接以获取所有通配符https://www.w3schools.com/sql/sql_wildcards.asp

的说明

答案 2 :(得分:2)

在SQL Server中使用字符串时,将对每个字母进行排序,并且这些字母的排序顺序取决于排序规则。对于某些字符,排序方法更容易理解,它按字母顺序或数字顺序排列:例如'a' < 'b''4' > '2'。根据排序规则,可以先写字母再写大小写('AaBbCc....'),也可以先写字母再写大小写('ABC...Zabc')。

让我们使用一个像'Abby'这样的字符串,它将按照字母A,b,b,y的顺序进行排序(它们出现的顺序将取决于您的排序规则,我不知道是什么,但我将假设进行'AaBbCc....'排序,因为它们比较常见)。任何以'Aba'之类的字符串开头的值都比'Abby'出售,因为第三个字符(不同的第一个字符)具有“较低的值”。就像'Abbie'这样的值('i'的值比'y'的值低)。同样,像'Abc'这样的字符串将具有更大的值,因为'c'的值要大于'b'(这是第一个不同的字符)。

如果我们将数字混在一起,那么您可能会感到惊讶。例如,字符串(重要的是,我没有说明数字)'123456789'的值比字符串'9'。这是因为第一个字符与第一个字符不同。 '9'大于'1',因此'9'的值较高。这就是为什么要确保将数字存储为数值数据类型如此重要的原因之一,因为这种行为不太可能是您期望的/否则的。

不过,对于您要问的是,SQL Server的通配符为'%''_'(也有'^',m,但我在这里不作介绍)。 '%'代表多个字符,而'_'代表单个字符。如果要专门查找这些字符之一,则必须在方括号([])中加上引号。

使用等于(=)运算符不会解析通配符。您需要使用一个功能,例如LIKE。因此,如果您想要一个以'A'开头的单词,则可以使用表达式WHERE ColumnName LIKE 'A%'。如果要搜索一个由6个字符组成且以'ed'结尾的字符,则可以使用WHERE ColumnName LIKE '____ed'

就像我之前说过的,如果您要搜索这些特定字符之一,请引述。因此,如果您要搜索包含下划线的字符串,则语法为WHERE ColumnName LIKE '%[_]%'

编辑:还值得注意的是,当使用LIKE之类的东西时,它们受归类敏感性影响;例如Case和Accent。例如,如果您使用区分大小写的排序规则,则语句WHERE 'Abby' LIKE 'abb%'是不正确的,而'A''a'则是不区分大小写的。同样,在重音敏感的排序规则中,WHERE 'Covea' = 'Covéa'语句将为假('e''é'不会被视为相同的字符)。

答案 3 :(得分:1)

这是因为>=<=是比较运算符。他们根据其 ASCII 值比较字符串。

由于*的 ASCII 值为 42 ,并且大写字母的 ASCII 值从65开始,所以这就是您尝试{{1 }},sql-server选择了字符串中第一个字符的ASCII值(即42),因为数据中没有任何值的第一个字符的ASCII值小于42,因此未选择任何数据。

您可以参考ASCII表以进一步了解:

http://www.asciitable.com/

答案 4 :(得分:1)

有一些答案和一些评论-我会尝试总结一下。

首先,wildcard in SQL是%,而不是*(用于多次匹配)。因此,您的查询(包括*)要求与该文字字符串进行比较。

第二,比较大于/小于运算符的字符串可能无法满足您的要求-它使用collation order来查看排序顺序中哪些其他字符串是“更早”或“更晚”。排序顺序是一个中等复杂的概念,在机器安装之间会有所不同。

SQL operator for string pattern matchingLIKE

我不确定我对>=<=陈述的意图是否了解-您是否要返回名称的第一个字母在字母“ A”之后的行?