13

我没有找到类似isupperislower在 postgresql 中的任何函数。我真正需要的是从表中选择所有记录,其中一列包含大写(但不是大写)单词。即每个单词的第一个符号为大写,第二个为小写。单词可以用任何语言书写。

4

4 回答 4

32

如果只选择列中第一个字母的大小写不等于列中第一个字母的小写版本的行呢?

就像是:

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

理论上,上述内容也应考虑数据库字符集/语言环境。

于 2012-12-04T16:38:35.607 回答
15

您可以使用Postgres 正则表达式来测试您的具体情况:

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

E'^[[:upper:]][[:lower:]]'如果第二个字符必须是小写字母而不是任何非大写字母,则可以使用。

于 2012-12-04T17:40:09.190 回答
5

如果你想知道一个字符串是否至少包含一个小写字符,那么你可以使用上面的函数[upper(mystr)=mystr]:

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

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

您可以使用相同的逻辑来使用 lower() sql 函数检查字符串是否包含至少一个大写字符。

对于更复杂的模式,您将需要使用早期答案中提出的正则表达式或子字符串。

于 2018-01-05T06:02:22.290 回答
1

由于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 之间,则为小写

于 2012-12-04T16:36:56.887 回答