C'è StartsWith o Contains in t sql con variabili?


94

Sto cercando di rilevare se il server esegue Express Edition.

Ho il seguente t sql.

DECLARE @edition varchar(50); 
set @edition = cast((select SERVERPROPERTY ('edition')) as varchar)

print @edition

Nel mio caso, @edition = Express Edition (64-bit)

Come posso fare quanto segue? (Ispirato a C #).

DECLARE @isExpress bit;
set @isExpress = @edition.StartsWith('Express Edition');

Risposte:


122

Inizia con

a) left(@edition, 15) = 'Express Edition'
b) charindex('Express Edition', @edition) = 1

Contiene

charindex('Express Edition', @edition) >= 1

Esempi

left funzione

set @isExpress = case when left(@edition, 15) = 'Express Edition' then 1 else 0 end

iif funzione (a partire da SQL Server 2012)

set @isExpress = iif(left(@edition, 15) = 'Express Edition', 1, 0);

charindex funzione

set @isExpress = iif(charindex('Express Edition', @edition) = 1, 1, 0);

1
Si noti che internamente questi funzionano in modo diverso, soprattutto rispetto alle prestazioni e al suo utilizzo degli indici. Ad esempio, una query che utilizza colName LIKE 'prefix%'sarà molto veloce quando colNameviene indicizzata, ma colName LIKE '%substring%'o colName LIKE '%suffix'sarà lenta perché SQL Server non crea alberi dei suffissi durante l'indicizzazione del testo. Allo stesso modo, anche l'utilizzo LEFTcon una colonna sarà lento perché tali query non sono SARGable. La SARGability è importante: dba.stackexchange.com/questions/162263/…
Dai

Consiglierei di testare il metodo LIKE 'x%' menzionato di seguito. In alcuni casi è molto più veloce
Tony Sepia il

72

Sembra che quello che vuoi è http://msdn.microsoft.com/en-us/library/ms186323.aspx .

Nel tuo esempio sarebbe (inizia con):

set @isExpress = (CharIndex('Express Edition', @edition) = 1)

O contiene

set @isExpress = (CharIndex('Express Edition', @edition) >= 1)

Perché non usare MI PIACE Express Edition%? Inoltre, la tua soluzione non restituisce vero se "Express Edition" è ovunque nella stringa? Quindi è più specificamente solo un modo "Contiene" per farlo
Don Cheadle

3
@mmcrae Mentre si utilizza la versione simile di seguito andrebbe bene, questo è stato il primo modo che mi è venuto in mente e assomiglia di più a quello che aveva l'OP. Inoltre, la prima espressione restituirà true solo se la variabile inizia con (charindex restituisce 1) l'argomento specificato. La seconda espressione è un contiene poiché restituirà true se l'argomento si trova in un punto qualsiasi della stringa (charindex restituisce 1 o maggiore).
Gary.S

45

io userei

like 'Express Edition%'

Esempio:

DECLARE @edition varchar(50); 
set @edition = cast((select SERVERPROPERTY ('edition')) as varchar)

DECLARE @isExpress bit
if @edition like 'Express Edition%'
    set @isExpress = 1;
else
    set @isExpress = 0;

print @isExpress

Se leggi la domanda, non è una query. Prova il mio esempio con la tua risposta e poi aggiorna la tua risposta mostrando che funziona.
Valamas

Puoi usare come nelle istruzioni if ​​in t-sql. Questo è il motivo per cui uso like. Non vedo perché vuoi darmi punti meno per questo, ma perché no.
Thomas Koelle

9
Questo dovrebbe essere il modo preferito; è più elegante, meno prolisso e "SQL allineato": poiché utilizza l'operatore SQL LIKE standard, non dovrei aver bisogno di leggere la documentazione per capirlo!
Fer García
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.