很抱歉,这是否是之前提出的问题,但我无法找到答案。 如何创建MySQL select语句以从数据库中选择所有首字符为小写或大写的字符串。
我通常会使用类似的方法从英语单词数据库中选择10个长度超过8个字符的随机单词:
SELECT word FROM en_dictionary WHERE CHAR_LENGTH(word)>8 ORDER BY RAND() LIMIT 10
不幸的是,这也选择了我在结果中不需要的大写字母,因为它们通常是诸如城市名称,物种名称之类的术语。
所以,我的问题是:有没有办法只选择以小写字母(或大写)开头的单词?
我可以做这样的事情,它会起作用,但这将是一个非常丑陋的声明:
AND word LIKE BINARY 'a%' AND word LIKE BINARY 'b%' AND word LIKE BINARY 'c%'...
答案 0 :(得分:2)
您可以使用Ascii()
功能。它返回输入字符串最左边字符的数值。
对于小写首字母:a
的ASCII码为 97 ,而z
的 122 。因此,第一个字符的ASCII码应介于97和122之间。
SELECT word
FROM en_dictionary
WHERE CHAR_LENGTH(word) > 8
AND ASCII(word) BETWEEN 97 AND 122
ORDER BY RAND() LIMIT 10
对于大写首字符:A
的ASCII码为 65 ,而Z
的 90 。因此,第一个字符的ASCII码应在65到90之间。
SELECT word
FROM en_dictionary
WHERE CHAR_LENGTH(word) > 8
AND ASCII(word) BETWEEN 65 AND 90
ORDER BY RAND() LIMIT 10
答案 1 :(得分:2)
您可以使用SUBSTRING和REGEXP BINARY
SELECT word
FROM en_dictionary
WHERE CHAR_LENGTH(word)>8
AND SUBSTRING(word, 1, 1) REGEXP BINARY '[A-Z]'
ORDER BY RAND() LIMIT 10
使用 REGEXP BINARY ,您可以根据需要使用任何正则表达式,请参见文档:https://dev.mysql.com/doc/refman/8.0/en/regexp.html
SUBSTRING 只是为了获得第一个字母。
请参见
How to check for uppercase letters in MySQL?
MySQL Select Query - Get only first 10 characters of a value
答案 2 :(得分:2)
这不是一个完整的答案,但是可以发表评论,所以我从中做出了答案。
我建议您使用区分大小写的utf8归类,例如utf8_bin
。
然后,您无需使用BINARY或其他MySQL“ hacks”即可获得所需的结果,而只需使用LIKE / BETWEEN且区分大小写即可。
创建表格
CREATE TABLE test (
utf8_general_ci_word VARCHAR(255) COLLATE utf8_general_ci
, utf8_bin_word VARCHAR(255) COLLATE utf8_bin
);
INSERT INTO test (utf8_general_ci_word, utf8_bin_word) VALUES('a', 'a');
INSERT INTO test (utf8_general_ci_word, utf8_bin_word) VALUES('A', 'A');
INSERT INTO test (utf8_general_ci_word, utf8_bin_word) VALUES('b', 'b');
INSERT INTO test (utf8_general_ci_word, utf8_bin_word) VALUES('B', 'B');
结果
查询#1
SELECT
utf8_general_ci_word
FROM
test
WHERE
utf8_general_ci_word LIKE 'a%'
;
| utf8_general_ci_word |
| -------------------- |
| a |
| A |
查询#2
SELECT
utf8_general_ci_word
FROM
test
WHERE
utf8_general_ci_word LIKE BINARY 'a%'
;
| utf8_general_ci_word |
| -------------------- |
| a |
查询#3
SELECT
utf8_bin_word
FROM
test
WHERE
utf8_bin_word LIKE 'a%';
| utf8_bin_word |
| ------------- |
| a |
因此您的查询将类似于
查询
SELECT
word
FROM
en_dictionary
WHERE
CHAR_LENGTH(word) > 8
AND
word BETWEEN 'a' AND 'z'
ORDER BY
RAND()
LIMIT 10
答案 3 :(得分:0)
如果您收到的字母不在a-z范围内(即非英语):
WHERE BINARY LEFT(letters , 1) = UPPER(LEFT(letters, 1))
如果您收到其他字母(例如“#”或数字),则尝试失败:
WHERE LEFT(letters COLLATE latin1_general_cs, 1) REGEXP '[[:upper:]]'