查看这两个查询
SELECT *
FROM user
WHERE user_name BETWEEN 'A' AND 'Z'
ORDER BY user_name
SELECT *
FROM user
WHERE user_name LIKE '[a-z]%'
他们不应该给出相同的答案吗? 第一个是返回答案603,第二个是没有返回任何内容
答案 0 :(得分:1)
第一个语句使所有user_name大于/等于A且低于/等于Z(应用字母排序)
第二个get all user_name start a-z。
如果您有这些行:
第一个查询得到:
第二个得到......没什么
答案 1 :(得分:1)
不,因为邪恶的我可以输入以空格开头的用户名,或者像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区分大小写,在您的查询之间,您使用大写字母。我假设你的用户名以大写字母开头(哈哈;))?
当PostGre和您想要不区分大小写的查询时,请使用ILIKE:
WHERE user_name ILIKE '[a-z]%'
答案 2 :(得分:1)
如果您使用的是mysql,那么范围外卡([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在内的所有行。