MySQL-选择第一个字符为小写或大写的位置

时间:2018-10-30 11:41:24

标签: mysql sql mariadb uppercase lowercase

很抱歉,这是否是之前提出的问题,但我无法找到答案。 如何创建MySQL select语句以从数据库中选择所有首字符为小写或大写的字符串。

我通常会使用类似的方法从英语单词数据库中选择10个长度超过8个字符的随机单词:

SELECT word FROM en_dictionary WHERE CHAR_LENGTH(word)>8 ORDER BY RAND() LIMIT 10

不幸的是,这也选择了我在结果中不需要的大写字母,因为它们通常是诸如城市名称,物种名称之类的术语。

enter image description here

所以,我的问题是:有没有办法只选择以小写字母(或大写)开头的单词?

我可以做这样的事情,它会起作用,但这将是一个非常丑陋的声明:

AND word LIKE BINARY 'a%' AND word LIKE BINARY 'b%' AND word LIKE BINARY 'c%'...

4 个答案:

答案 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             |

demo

因此您的查询将类似于

查询

SELECT
  word
FROM
  en_dictionary
WHERE
    CHAR_LENGTH(word) > 8
  AND
    word BETWEEN 'a' AND 'z'
ORDER BY
 RAND()
LIMIT 10

demo on the test data

答案 3 :(得分:0)

如果您收到的字母不在a-z范围内(即非英语):

WHERE BINARY LEFT(letters , 1) = UPPER(LEFT(letters, 1)) 

如果您收到其他字母(例如“#”或数字),则尝试失败:

WHERE LEFT(letters COLLATE latin1_general_cs, 1) REGEXP '[[:upper:]]'