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

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

4 ответов


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

что-то типа:

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

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


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

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

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


С 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 это нижний регистр


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

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

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

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

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