MySQL - выберите, где первый символ в нижнем или верхнем регистре - PullRequest
0 голосов
/ 30 октября 2018

Извините, если это то, что было задано ранее, но я не могу найти ответ на этот вопрос. Как создать оператор выбора MySQL, чтобы выбрать все строки из базы данных, чьи первые символы либо в нижнем, либо в верхнем регистре.

Обычно я бы использовал что-то подобное для выбора 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 голосов
/ 30 октября 2018

Если вы получили буквы за пределами диапазона a-z (т.е. не на английском языке):

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

Это не удастся, если у вас есть другие буквы, такие как «#» или цифры, затем попробуйте:

WHERE LEFT(letters COLLATE latin1_general_cs, 1) REGEXP '[[:upper:]]'
0 голосов
/ 30 октября 2018

Вы можете использовать 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 просто для получения первой буквы.

См.

Как проверить заглавные буквы в MySQL?

MySQL Select Query - получить только первые 10 символов значения

0 голосов
/ 30 октября 2018

Не полный ответ, но слишком большой комментарий, поэтому я сделал из него ответ.

Я советую вам использовать чувствительный к регистру файл utf8, как utf8_bin
Тогда вам не нужно использовать BINARY или другие «хаки» MySQL для получения нужных вам результатов, вы можете просто использовать 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

демо по данным испытаний

0 голосов
/ 30 октября 2018

Вы можете использовать функцию Ascii(). Возвращает числовое значение крайнего левого символа входной строки.

Для строчных первых символов : ASCII-код a равен 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

Для заглавных букв : ASCII-код A равен 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
...