SQL:如果使用字符类[0-9],为什么LIKE不起作用?

bim*_*rez 6 mysql sql case sql-like

假设我有一张桌子:

当前表格:

title_id        title_name               title_qty
   1       A.I. Artificial Intelligence      2
   2       Batman Begins                    40
   3       2012                              7
   4       101 Dalmatians                   23
   5       Act of Valor                      1
   6       Batman                           50
   7       20 Million Miles to Earth       340
Run Code Online (Sandbox Code Playgroud)

我希望得到一个输出:

期望的输出:

   title_id        title_name               title_qty  title_char
       4          101 Dalmatians                23          #
       7          20 Million Miles to Earth     340         #
       3                2012                    7           #
       1          A.I. Artificial Intelligence  2           A
       5          Act of Valor                  1           A
       6          Batman                        50          B
       2          Batman Begins                 40          B
Run Code Online (Sandbox Code Playgroud)

基于我在Stack Overflow中读到的内容,检查字符是否为数字的最快方法是使用LIKE'[0-9]%',所以我想出了

查询:

SELECT*,左边的情况(title_name,1)LIKE'[0-9]%'THEN"#"ELSE LEFT(title_name,1)END as title_char FROM title ORDER BY title_name

输出:

title_id        title_name               title_qty  title_char
   4          101 Dalmatians                23          1
   7          20 Million Miles to Earth     340         2
   3                2012                    7           2
   1          A.I. Artificial Intelligence  2           A
   5          Act of Valor                  1           A
   6          Batman                        50          B
   2          Batman Begins                 40          B
Run Code Online (Sandbox Code Playgroud)

如上所示,它根本不起作用.但是,如果我将LIKE更改为匹配单个数字,则可以:

SELECT*,左边的情况(title_name,1)LIKE'1 %'那么"#"ELSE LEFT(title_name,1)END as title_char FROM title ORDER BY title_name

title_id        title_name               title_qty  title_char
   4          101 Dalmatians                23          #
   7          20 Million Miles to Earth     340         2
   3                2012                    7           2
   1          A.I. Artificial Intelligence  2           A
   5          Act of Valor                  1           A
   6          Batman                        50          B
   2          Batman Begins                 40          B
Run Code Online (Sandbox Code Playgroud)

我最初认为它不起作用,因为我的查询有点复杂所以我做了一个简单的SELECT WHERE.在WHERE之后添加LIKE.

没有输出(当应该有三个):

SELECT * FROM title WHERE title_name LIKE '[0-9]%' ORDER BY title_name 
Run Code Online (Sandbox Code Playgroud)

按预期工作:

SELECT * FROM title WHERE title_name LIKE '1%' ORDER BY title_name 

SELECT * FROM title WHERE title_name LIKE '2%' ORDER BY title_name
Run Code Online (Sandbox Code Playgroud)

根据SQL文档,

字符类"[...]"匹配括号内的任何字符.例如,"[abc]"匹配"a","b"或"c".要命名一系列字符,请使用短划线."[az]"匹配任何字母,而"[0-9]"匹配任何数字.

任何人都知道如果你使用字符类[0-9]它为什么不起作用?作为初学者,如果我错了,请纠正我.但我很好奇为什么它可以使用LIKE'1%'或任何数字,而LIKE'[0-9]%'不会给出任何结果?文档说它应该匹配任何数字吧?如果将它作为整数强制转换是一项要求,它不适用于我的所有测试,对吧?因为在进行LIKE比较之前我没有投出它.

SQL小提琴: http ://sqlfiddle.com/#!2/492906/7

小智 6

文档有点令人困惑.我希望仔细剪切可以使它更清晰:

MySQL提供标准的SQL模式匹配以及模式匹配的形式

[...]

SQL模式匹配使您可以使用" _"匹配任何单个字符,使用" %"匹配任意数量的字符(包括零个字符).在MySQL中,SQL模式默认情况下不区分大小写.这里显示了一些例子.您不使用=<>使用SQL模式时; 使用LIKENOT LIKE比较运算符.

[...]

MySQL提供的另一种模式匹配使用扩展的正则表达式.当您为这种类型的模式测试匹配时,请使用REGEXPNOT REGEXP运算符(或RLIKENOT RLIKE,它们是同义词).

[...]

字符类" [...]"匹配括号内的任何字符.例如," [abc]"匹配" a"," b"或" c".要命名一系列字符,请使用短划线." [a-z]"匹配任何字母,而" [0-9]"匹配任何数字.

由于最后一句话属于"其他类型的模式匹配",它只适用于RLIKE您已经找到的,而不是LIKE.