Как определить, является ли символ прописным или строчным в postgresql?

Мне не удалось найти какую-либо функцию, подобную isupper или islower, в postgresql. Что мне действительно нужно, так это выбрать все записи из таблицы, где один из столбцов содержит слова с заглавной буквы (но не в верхнем регистре). То есть первый символ каждого слова прописной, а второй строчной. Слова могут быть написаны на любом языке.


person Pupkov-Zadnij    schedule 04.12.2012    source источник


Ответы (4)


Как насчет того, чтобы просто выбрать строки, в которых регистр первой буквы в столбце не равен строчной версии первой буквы в столбце?

Что-то типа:

SELECT * FROM table 
    WHERE SUBSTRING(col FROM 1 FOR 1) != LOWER(SUBSTRING(col FROM 1 FOR 1))

Теоретически вышеизложенное также должно учитывать кодировку/язык базы данных.

person BobG    schedule 04.12.2012
comment
@Marc: Может быть, я неправильно прочитал ваш комментарий, но когда я опубликовал SELECT, я проверил синтаксис в MySQL вместо Postgres, так как у меня не было под рукой экземпляра Postgres (я уже знал, что функции LOWER/UPPER/SUBSTRING действительны в Постгресе). Он отлично работал в MySQL (v 5.1.something), успешно возвращая строку, содержащую «Abc», но не строку, содержащую «xyz». - person BobG; 05.12.2012
comment
Извините, я не ясно выразился. Это зависит от вашей сортировки. По умолчанию это Latin1 и latin1_swedish_ci, которые нечувствительны к регистру. dev.mysql.com/doc/refman/5.0/en/ чувствительность к регистру.html - person Marc; 05.12.2012

Вы можете использовать регулярное выражение Postgres для проверки для вашего конкретного состояния:

select * from sample 
where col ~ E'^[[:upper:]][^[:upper:]]'

Вы можете использовать E'^[[:upper:]][[:lower:]]', если второй символ должен быть в нижнем регистре, а не в верхнем регистре.

person dbenhur    schedule 04.12.2012

Если вы хотите узнать, содержит ли строка хотя бы один символ нижнего регистра, вы можете использовать верхнюю функцию [upper(mystr)=mystr]:

dbname=> select upper('AAbbCC')='AAbbCC';
 ?column? 
----------
 f
(1 row)

dbname=> select upper('AABBCC')='AABBCC';
 ?column? 
----------
 t
(1 row)

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

Для более сложного шаблона вам нужно будет использовать регулярное выражение или подстроку, как было предложено в предыдущих ответах.

person Kemin Zhou    schedule 05.01.2018

Поскольку postgresql чувствителен к регистру для сравнения строк, ответ BobG лучше

Другим решением может быть использование ascii с строковые функции

Так

SELECT * 
FROM yourTable
WHERE (ascii(LEFT(yourColumn), 1) BETWEEN 65 AND 90) 
  AND (ascii(SUBSTRING(yourColumn from 2 for 1), 1) BETWEEN 97 AND 122)

когда он находится между 65 и 90, это заглавная буква, как вы можете видеть в таблице ascii, которую я связал

если между 97 и 122 это нижний регистр

person Marc    schedule 04.12.2012
comment
Это решение хорошее, но оно не работает для русского, китайского и других языков, отличных от ascii ;) - person Pupkov-Zadnij; 05.12.2012