【发布时间】:2019-02-14 14:54:30
【问题描述】:
假设我的表格如下所示:
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',为什么我没有得到任何结果?
【问题讨论】:
-
通配符不是比较。 SQL,这种语言,无论如何都不使用
*作为通配符。如果要执行通配符搜索,请使用LIKE,例如LIKE 'Abby%' -
您的所有结果都被简单地解释为
*在这里没有特殊含义,无论您使用什么排序规则,它都排在A之前。 -
您不要在文本列上使用
>=、<=等。对于通配符搜索,请使用 LIKE -
比较字符串时,
*、_、%只是字符。在*和B之间应用与A和B之间相同的排序规则。 -
即使星号是一个通配符(它不是),你希望发生什么? '*' 将匹配 'A' 和 'Z' (以及任何其他字符甚至字符组)。那么“Jose”会出现在“*Abby”之前还是之后呢?它肯定在“AAbby”之后和“ZAbby”之前。这种比较没有任何意义,对吧?
标签: sql sql-server wildcard string-comparison