看看这两个查询
SELECT *
FROM user
WHERE user_name BETWEEN 'A' AND 'Z'
ORDER BY user_name
SELECT *
FROM user
WHERE user_name LIKE '[a-z]%'他们不应该给出同样的答案吗?
第一个返回答案603,第二个不返回任何内容
发布于 2013-11-22 16:28:20
第一条语句get all user_name大于/等于A和lower /等于Z(应用字母排序)
第二个是get all user_name start a-z。
如果您有以下行:
第一个查询得到:
第二个得到...nothing
发布于 2013-11-22 16:30:39
不,因为邪恶的我可以输入以空格开头的用户名,也可以输入像Zina这样的用户名
这不在A-Z的范围内(例如,‘Zina’将在A-ZZ的范围内)。
如果使用以下命令,可能会得到(或多或少)相同的结果
WHERE user_name BETWEEN 'A' AND 'ZZZZZZZZZZZZZZZZZZZ' 此外,它还取决于排序规则的区分大小写。
第二个查询获取所有以a到z开头的用户名,但它们可能包括其他开始字符,因为在这个范围(for real)中可能只有一些花哨的土耳其字符。
你应该更好地使用
WHERE user_name LIKE '[abcdefghijklmnopqrstuvwxyz]%'这是假设您只有ASCII用户名。
(例如,这不适用于德语äöü)
备注:
您的最后一句话导致我得出结论,您的第二个查询没有返回任何内容。
您没有指明所使用的RDBMS系统类型,但是如果您使用的是PostGreSQL,那么在第二个查询中什么都得不到的原因是postgre区分大小写,并且在您的between查询中使用大写字母。我假设您的用户名以大写字母(Haha ;)开头?
当PostGre和你想要一个不区分大小写的查询时,使用ILIKE:
WHERE user_name ILIKE '[a-z]%'发布于 2013-11-22 16:33:49
如果您使用的是mysql,那么like范围通配符(a-z)将不起作用。请尝试使用“RLIKE”。-其中RLIKE 'a-z‘
在A到Z之间将进行词法有序匹配,其中=>A和<=Z示例{A,AA,BA,CA,Z,ZA}将检索{A,AA,BA,CA,Z},而不是ZA,但在a-z%中,您将获得包括ZA在内的所有行。
https://stackoverflow.com/questions/20139994
复制相似问题