2012-12-04 5 views
7

Non sono riuscito a trovare alcuna funzione come isupper o islower in postgresql. Quello di cui ho realmente bisogno è selezionare tutti i record da una tabella, dove una delle colonne contiene parole maiuscole (ma non maiuscole). Cioè, il primo simbolo di ogni parola è in maiuscolo e il secondo è in minuscolo. Le parole possono essere scritte in qualsiasi lingua.Come determinare se un charater è maiuscolo o minuscolo in postgresql?

risposta

13

Che dire semplicemente selezionando le righe in cui il caso della prima lettera nella colonna non è uguale alla versione in minuscolo della prima lettera nella colonna?

Qualcosa di simile:

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

In teoria, quanto sopra dovrebbe prendere il database charset/locale in considerazione pure.

+0

Smart! Non ho pensato a questo perché sono abituato a MySQL che non è sensibile al maiuscolo/minuscolo per confronti tra stringhe – Marc

+0

Ecco come ho fatto, è una soluzione per il mio particolare problema. –

+0

@Marc: Forse sto leggendo male il tuo commento, ma quando ho postato la SELECT, ho testato la sintassi in MySQL invece di Postgres poiché non avevo un'istanza di Postgres a portata di mano (sapevo già che le funzioni LOWER/UPPER/SUBSTRING erano valido in Postgres). Ha funzionato bene in MySQL (v 5.1. Qualcosa), restituendo con successo una riga che conteneva 'Abc' ma non la riga contenente 'xyz'. – BobG

0

Dal postgresql è case sensitive per i confronti di stringhe, BobG risposta è meglio

Un'altra soluzione potrebbe essere quella di utilizzare ascii con string functions

Ti piace questa

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) 

quando è tra il 65 e il 90 è una lettera maiuscola come potete vedere nella tabella ascii Ho collegato

se E 'tra 97 e 122 è in minuscolo

+0

Questa soluzione è buona, ma non funziona per russo, cinese e altre lingue non ascii;) –

7

È possibile utilizzare Postgres regexp per verificare la vostra condizione specifica:

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

Potreste usare E'^[[:upper:]][[:lower:]]' se il secondo carattere deve essere alpha minuscola invece che qualsiasi non-maiuscolo.

0

Se vuoi sapere se una stringa contiene almeno un carattere minuscolo quindi è possibile utilizzare la funzione superiore [superiore (mystr) = mystr]:

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

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

È possibile utilizzare la stessa logica per la verifica che una stringa contiene almeno un carattere maiuscolo con la funzione lower() sql.

Per motivi più complessi, è necessario utilizzare l'espressione regolare o la sottostringa come proposto dalle risposte precedenti.

Problemi correlati