2012-12-04 118 views
7

我沒能找到像PostgreSQL中isupperislower任何功能。 我實際需要的是從表中選擇所有記錄,其中一列包含capitized(但不是大寫)字。也就是說,每個單詞的第一個符號是大寫字母,第二個是小寫字母。單詞可以用任何語言書寫。如何確定postgresql中的特徵是大寫還是小寫?

回答

13

大約只選擇行,其中在列的第一個字母的大小寫不等於在列的第一個字母的小寫版本是什麼?

喜歡的東西:

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

從理論上講,以上應採取數據庫字符集/語言環境考慮爲好。

+0

聰明!我沒有考慮過這個原因,我習慣於MySQL,這對字符串比較不區分大小寫 – Marc

+0

這就是我的做法,它是解決特定問題的解決方案。 –

+0

@Marc:也許我誤解你的評論,但是當我張貼的選擇,我測試在MySQL的,而不是Postgres的語法,因爲我沒有一個Postgres實例方便(我已經知道了側/上側/ SUBSTRING功能均在Postgres中有效)。它在MySQL(v 5.1.something)中工作得很好,成功返回一個包含'Abc'但不包含'xyz'的行。 – BobG

0

由於postgresql是區分大小寫字符串比較,BobG答案是更好

另一種解決方案是使用asciistring 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之間是小寫

+0

這個解決方案是好的,BOT它並不適用於俄羅斯,中國和其他非ASCII語言的工作;) –

7

您可以使用Postgres regexp來測試您的具體情況:

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

你可以使用E'^[[:upper:]][[:lower:]]'如果第二個字符必須是小寫字母,而不是任何非大寫。

0

如果你想知道一個字符串是否包含至少一個小寫字符,那麼你可以使用上層函數[上(myStr的)= myStr中]:

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

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

您可以使用相同的邏輯檢查一個字符串至少包含一個帶有lower()sql函數的大寫字符。

對於更復雜的模式,你將需要爲提議由早期的答案使用正則表達式或字符串。

相關問題