2013-08-08 9 views
13

Tutti,prova per Maiuscolo - T-Sql

Come posso verificare se un personaggio varchar specificato o tutta la stringa è maiuscola in T-SQL? Idealmente mi piacerebbe scrivere una funzione per verificare se un carattere è maiuscolo, quindi posso applicarlo successivamente a un varchar generico. Dovrebbe restituire false per caratteri non alfabetici. Mi interessano solo i personaggi di lingua inglese.

Sto lavorando con T-SQL in SQL Management Studio e ho provato tirando record che iniziano con una lettera minuscola da una tabella in questo modo:

select * from TABLE 
where SUBSTRING(author,1,1) != LOWER(SUBSTRING(author,1,1)) 

che restituisce 0 record, ma so ci sono record che iniziano con lettere maiuscole e minuscole.

Grazie


EDIT: Dato che sia podiluska e joachim-isaksoon hanno risposto con successo alla mia domanda (Entrambi i metodi di lavoro per i miei scopi), sarebbe qualcuno mente spiegando che sarebbe il metodo più efficiente di utilizzare per interrogare una tabella con un numero elevato di record per filtrare i record con autori che iniziano con o senza una lettera maiuscola?

+1

"Caratteri non alfabetici" in quale lingua? Restituisce vero o falso per 'Π'? (maiuscolo 'π') –

+0

Grazie Martin, ho migliorato la mia domanda. Non mi interessa cosa restituisce per i caratteri dell'alfabeto non inglese. – Danzomida

+2

Risposta alla parte EDIT: dovrebbe essere irrilevante, entrambe le query dovrebbero eseguire lo stesso. In entrambi i casi è necessario scorrere l'intera tabella e recuperare il valore di 'author' per ogni riga, che è ciò che richiede il 99% del tempo di interrogazione. Funzioni come 'LOWER()', 'UNICODE()' sono prive di significato in termini di prestazioni e qualunque cosa scegliate non dovrebbe fare la differenza. Detto ciò, suggerisco comunque di testare entrambe le query sui dati effettivi e vedere se funziona meglio. –

risposta

23

Uso collations

esempio:

if ('a'='A' Collate Latin1_General_CI_AI) 
    print'same 1' 
else 
    print 'different 1' 

if ('a'='A' Collate Latin1_General_CS_AI) 
    print'same 2' 
else 
    print 'different 2' 

Il CS nel nome di confronto indica Case Sensitive (e CI, case insensitive). L'AI/AS si riferisce alla sensibilità d'accento.

o nel tuo esempio

SUBSTRING(author,1,1) <> LOWER(SUBSTRING(author,1,1)) COLLATE Latin1_General_CS_AI 
1

qualcosa come

declare @v varchar(10) = 'ABC', @ret int = 0 
select @ret = 1 where upper(@v)[email protected] COLLATE SQL_Latin1_General_CP1_CS_AS 
select @ret 
10

Per verificare se ch è maiuscola, ed è un personaggio che può essere convertito tra lettere maiuscole e minuscole (escludendo cioè non alfabetici personaggi);

WHERE UNICODE(ch) <> UNICODE(LOWER(ch)) 

An SQLfiddle to test with;

+0

Funzionerà, ma confrontare un'intera stringa sarà un dolore :) – podiluska

+0

@podiluska In effetti, ma non è molto chiaro cosa fare con intere stringhe che comunque contengono simboli, così ho deciso di risolvere il problema limitato :) –