sql喜欢和之间

时间:2013-11-22 08:10:47

标签: sql between sql-like

查看这两个查询

SELECT * 
FROM user 
WHERE user_name BETWEEN 'A' AND 'Z' 
ORDER  BY user_name

SELECT * 
FROM user 
WHERE user_name LIKE '[a-z]%'

他们不应该给出相同的答案吗? 第一个是返回答案603,第二个是没有返回任何内容

3 个答案:

答案 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在内的所有行。