Come eseguire una ricerca con distinzione tra maiuscole e minuscole e sostituirla in SQL 2000/2005?
-
02-07-2019 - |
Domanda
Per eseguire una ricerca con distinzione tra maiuscole e minuscole su una tabella in un database SQL Server 2000/2005, è necessario utilizzare le regole di confronto corrette.
Come si determina se le regole di confronto predefinite per un database fanno distinzione tra maiuscole e minuscole e, in caso contrario, come eseguire una ricerca / sostituzione con distinzione tra maiuscole e minuscole?
Soluzione
SELECT testColumn FROM testTable
WHERE testColumn COLLATE Latin1_General_CS_AS = 'example'
SELECT testColumn FROM testTable
WHERE testColumn COLLATE Latin1_General_CS_AS = 'EXAMPLE'
SELECT testColumn FROM testTable
WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe'
Non dare per scontato che le regole di confronto predefinite facciano distinzione tra maiuscole e minuscole, specifica sempre una distinzione tra maiuscole e minuscole ogni volta (utilizzando quella corretta per la tua lingua ovviamente)
Altri suggerimenti
Determina se le regole di confronto predefinite fanno distinzione tra maiuscole e minuscole in questo modo:
select charindex ('RESULT', 'Se il risultato è 0 ci si trova in una modalità di confronto con distinzione tra maiuscole e minuscole')
Il risultato 0 indica che si è in una modalità di confronto con distinzione tra maiuscole e minuscole, 8 indica che non distingue tra maiuscole e minuscole.
Se le regole di confronto non fanno distinzione tra maiuscole e minuscole, è necessario dichiarare esplicitamente la modalità di confronto che si desidera utilizzare quando si esegue una ricerca / sostituzione.
Ecco come costruire un'istruzione UPDATE per eseguire una ricerca / sostituzione con distinzione tra maiuscole e minuscole specificando la modalità di fascicolazione da utilizzare:
update ContentTable
set ContentValue = replace(ContentValue COLLATE Latin1_General_BIN, 'THECONTENT', 'TheContent')
from StringResource
where charindex('THECONTENT', ContentValue COLLATE Latin1_General_BIN) > 0
Questo corrisponderà e sostituirà 'THECONTENT'
, ma non 'TheContent'
o 'thecontent'
.
Se hai casi diversi della stessa parola nello stesso campo e desideri solo sostituire casi specifici , puoi utilizzare regole di confronto nella funzione REPLACE
:
UPDATE tableName
SET fieldName =
REPLACE(
REPLACE(
fieldName COLLATE Latin1_General_CS_AS,
'camelCase' COLLATE Latin1_General_CS_AS,
'changedWord'
),
'CamelCase' COLLATE Latin1_General_CS_AS,
'ChangedWord'
)
Ciò comporterà:
This is camelCase 1 and this is CamelCase 2
divenire:
This is changedWord 1 and this is ChangedWord 2
Può essere fatto in più istruzioni. Questo non funzionerà se hai stringhe lunghe che contengono sia lettere maiuscole che minuscole che intendi sostituire. Potrebbe anche essere necessario utilizzare regole di confronto diverse, questo è accento e maiuscole / minuscole.
UPDATE T SET [String] = ReplacedString
FROM [dbo].[TranslationText] T,
(SELECT [LanguageCode]
,[StringNo]
,REPLACE([String], 'Favourite','Favorite') ReplacedString
FROM [dbo].[TranslationText]
WHERE
[String] COLLATE Latin1_General_CS_AS like '%Favourite%'
AND [LanguageCode] = 'en-us') US_STRINGS
WHERE
T.[LanguageCode] = US_STRINGS.[LanguageCode]
AND T.[StringNo] = US_STRINGS.[StringNo]
UPDATE T SET [String] = ReplacedString
FROM [dbo].[TranslationText] T,
(SELECT [LanguageCode]
,[StringNo]
, REPLACE([String], 'favourite','favorite') ReplacedString
FROM [dbo].[TranslationText]
WHERE
[String] COLLATE Latin1_General_CS_AS like '%favourite%'
AND [LanguageCode] = 'en-us') US_STRINGS
WHERE
T.[LanguageCode] = US_STRINGS.[LanguageCode]
AND T.[StringNo] = US_STRINGS.[StringNo]
Prima di tutto controlla questo: http://technet.microsoft.com/en-us /library/ms180175(SQL.90).aspx
Vedrai che CI specifica la distinzione tra maiuscole e minuscole e CS specifica la distinzione tra maiuscole e minuscole.
Inoltre, potrebbe essere utile. seleziona * da fn_helpcollations () - questo ottiene tutte le regole di confronto supportate dal tuo server. seleziona * da sys.d Database: qui c'è una colonna che specifica quali regole di confronto hanno tutti i database sul tuo server.
Puoi specificare le regole di confronto ogni volta che esegui una query sulla tabella oppure puoi applicare le regole di confronto alle colonne in modo permanente modificando la tabella.
Se si sceglie di eseguire il metodo di query, è utile includere anche gli argomenti di ricerca senza distinzione tra maiuscole e minuscole. Vedrai che SQL sceglierà un piano exec più efficiente se li includi. Ad esempio:
SELECT testColumn FROM testTable
WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe'
and testColumn = 'eXaMpLe'