Мне не удалось найти какую-либо функцию, подобную isupper
или islower
, в postgresql. Что мне действительно нужно, так это выбрать все записи из таблицы, где один из столбцов содержит слова с заглавной буквы (но не в верхнем регистре). То есть первый символ каждого слова прописной, а второй строчной. Слова могут быть написаны на любом языке.
Как определить, является ли символ прописным или строчным в postgresql?
Ответы (4)
Как насчет того, чтобы просто выбрать строки, в которых регистр первой буквы в столбце не равен строчной версии первой буквы в столбце?
Что-то типа:
SELECT * FROM table
WHERE SUBSTRING(col FROM 1 FOR 1) != LOWER(SUBSTRING(col FROM 1 FOR 1))
Теоретически вышеизложенное также должно учитывать кодировку/язык базы данных.
Вы можете использовать регулярное выражение Postgres для проверки для вашего конкретного состояния:
select * from sample
where col ~ E'^[[:upper:]][^[:upper:]]'
Вы можете использовать E'^[[:upper:]][[:lower:]]'
, если второй символ должен быть в нижнем регистре, а не в верхнем регистре.
Если вы хотите узнать, содержит ли строка хотя бы один символ нижнего регистра, вы можете использовать верхнюю функцию [upper(mystr)=mystr]:
dbname=> select upper('AAbbCC')='AAbbCC';
?column?
----------
f
(1 row)
dbname=> select upper('AABBCC')='AABBCC';
?column?
----------
t
(1 row)
Вы можете использовать ту же логику для проверки того, что строка содержит хотя бы один символ верхнего регистра, с помощью функции sql 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 это нижний регистр