Differenziazione tra “AB” e “Ab” in un campo di database carattere
-
21-08-2019 - |
Domanda
In particolare, Sql Server 2005 / T-SQL. Ho un campo che è in gran parte una serie di due personaggi, e sono tutti dovuto essere maiuscolo ma c'è un po 'di dati legacy che precede l'attuale DB / System, e ho bisogno di capire quali documenti sono in violazione della tomaia involucro patto.
Ho pensato che questo avrebbe funzionato:
select * from tbl where ascii(field1) <> ascii(upper(field1))
E in effetti mi ha restituito una manciata di record. Hanno da allora sono stati corretti, e ora che query restituisce alcun dato. Ma ho gente che mi dice c'è ancora dati dei casi misti nel DB, e ho appena trovato un esempio:. 'FS' e 'FS' sono entrambi riportare lo stesso valore ASCII
Perché è viziata questo approccio? Che è un modo migliore per andare su questo, o come posso risolvere questo approccio al lavoro correttamente?
Soluzione
se tutte le informazioni avrebbe dovuto essere in maiuscolo solo fare un aggiornamento
update tbl
set field1 = upper(field1)
, ma per rispondere alla tua domanda originale questa query dovrebbe dare i risultati che ci si aspetta:
select * from tbl
where field1 COLLATE Latin1_General_CS_AS <> upper(field1)
Edit: appena notato che il suggerimento di utilizzare COLLATE è stato pubblicato anche da Ian
Altri suggerimenti
ASCII è il confronto solo la prima lettera. Dovreste confrontare ogni lettera, o modificare le regole di confronto del database per essere maiuscole e minuscole.
È possibile modificare le regole di confronto su un intero livello di database, o solo su una colonna per una query specifica, in modo:
SELECT myColumn
FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS <> upper(myColumn)
La funzione ascii () restituirà solo il numero ASCII per il primo carattere in un'espressione, se lo si passa una stringa di caratteri multipla. Per fare il confronto che si desidera è necessario guardare a singoli caratteri, non interi campi.
La funzione ASCII () restituisce solo il valore del codice ASCII del carattere più a sinistra di un'espressione di caratteri. Utilizzare UPPER (), invece.
Questo potrebbe funzionare:
select * from tbl
where cast(field1 as varbinary(256)) <> cast(upper(field1) as varbinary(256))
I metodi descritti in Cassa di ricerca sensibili nelle query SQL Server potrebbe essere utile a voi.
Secondo il documentazione per ASCII()
, solo restituisce il carattere più a sinistra.
Credo che stai andando su questo torto. Si potrebbe semplicemente:
select * from tbl where field1 <> upper(field1)
se le regole di confronto sono state impostate correttamente, quindi perché non fissare le regole di confronto ? Se non è possibile modificare in modo permanente, provare:
select * from tbl where
(field1 collate Latin1_General_CS_AS)
<> upper(field1 collate Latin1_General_CS_AS)