我在postgresql中找不到像isupper
或islower
这样的函数。
我真正需要的是从表中选择所有记录,其中一列包含capitized(但不是大写)单词。也就是说,每个单词的第一个符号是大写,第二个是小写。单词可以用任何语言书写。
答案 0 :(得分:21)
如果只选择列中第一个字母大小写不等于列中第一个字母的小写版本的行呢?
类似的东西:
SELECT * FROM table
WHERE SUBSTRING(col FROM 1 FOR 1) != LOWER(SUBSTRING(col FROM 1 FOR 1))
理论上,上面的内容也应该考虑数据库字符集/语言环境。
答案 1 :(得分:10)
您可以使用Postgres regexp来测试您的具体情况:
select * from sample
where col ~ E'^[[:upper:]][^[:upper:]]'
如果第二个字符必须是小写字母而不是任何非大写字母,则可以使用E'^[[:upper:]][[:lower:]]'
。
答案 2 :(得分:0)
由于postgresql
对字符串比较区分大小写,因此BobG答案更好
另一种解决方案是将ascii与string functions
一起使用喜欢这个
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之间则为小写
答案 3 :(得分:0)
如果你想知道字符串是否包含至少一个小写字符,那么你可以使用上层函数[upper(mystr)= mystr]:
dbname=> select upper('AAbbCC')='AAbbCC';
?column?
----------
f
(1 row)
dbname=> select upper('AABBCC')='AABBCC';
?column?
----------
t
(1 row)
您可以使用相同的逻辑来检查字符串是否包含至少一个带有lower()sql函数的大写字符。
对于更复杂的模式,您需要使用前面答案中提出的正则表达式或子字符串。