【发布时间】:2013-12-13 08:30:27
【问题描述】:
假设我有一张桌子:
当前表:
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
我想要输出:
期望的输出:
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
根据我在 Stack Overflow 中读到的内容,检查字符是否为数字的最快方法是使用 LIKE '[0-9]%' 所以我想出了
查询:
SELECT *, CASE WHEN LEFT(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
如上所示,它根本不起作用。但是,如果我将 LIKE 更改为匹配单个数字,它会起作用:
SELECT *, CASE WHEN LEFT(title_name,1) LIKE '1%' 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 #
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
我最初认为它不起作用,因为我的查询有点复杂,所以我做了一个简单的 SELECT WHERE。 LIKE 在 WHERE 之后添加。
没有输出(应该有三个):
SELECT * FROM title WHERE title_name LIKE '[0-9]%' ORDER BY title_name
按预期工作:
SELECT * FROM title WHERE title_name LIKE '1%' ORDER BY title_name
SELECT * FROM title WHERE title_name LIKE '2%' ORDER BY title_name
根据 SQL 文档,
字符类“[...]”匹配括号内的任何字符。 例如,“[abc]”匹配“a”、“b”或“c”。命名一个范围 字符,使用破折号。 “[a-z]” 匹配任何字母,而 “[0-9]” 匹配任何数字。
任何人都知道如果您使用字符类 [0-9] 它为什么不起作用?作为初学者,如果我错了,请纠正我。但我很好奇,如果我使用 LIKE '1%' 或任何数字,而 LIKE '[0-9]%' 不会给出任何结果,为什么它会起作用?文档说它应该匹配任何数字对吗?如果将其转换为整数是一项要求,那么它不应该适用于我的所有测试,对吧?因为我在进行 LIKE 比较之前没有投射它。
SQL 小提琴: http://sqlfiddle.com/#!2/492906/7
【问题讨论】:
-
我编辑了问题...只是为了添加这个可以产生正确输出的查询,我使用了 RLIKE: SELECT *, CASE WHEN LEFT(title_name,1) RLIKE '[0-9 ]' THEN "#" ELSE LEFT(title_name,1) END as title_char FROM title ORDER BY title_name
-
The documentation you quote 大约是
RLIKE,而不是LIKE,所以这对我来说似乎是正确的。在其他 SQL 方言中,[...]被LIKE接受,但(显然)在 MySQL 中不接受。