Как определить, является ли символ прописным или строчным в 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.
для более сложного шаблона вам нужно будет использовать регулярное выражение или подстроку, как предлагалось в предыдущих ответах.