2011-07-22 31 views
6

Próbuję przechwycić nazwę zmiennej T-SQL, upewniając się, że wartość zmiennej jest poprzedzana nawiasem "[".Dlaczego operator "LIKE" T-SQL nie ocenia tego wyrażenia, tak jak myślę, że powinien?

Oto przykład jak próbuję to zrobić:

DECLARE @thing nvarchar(20) 
SET @thing = '[55555' 
IF(@thing NOT LIKE '[' + '%') --If the value does not start with [ then add it 
BEGIN 
SET @thing = '[' + @thing 
END 
PRINT @thing 

Powyższy przykład druku [[55555

Zauważ, że oryginalna wartość @thing została poprzedzona wspornika „[”. Oczekiwano, że warunki IF zwrócą fałsz od "[55555" is LIKE '[' + '%'

Dlaczego warunek IF nie zwraca wartości false? I, co ważniejsze, przypuszczam, jaka jest poprawna składnia do sprawdzenia istnienia ciągu znaków, który występuje na początku wartości zmiennej łańcuchowej?

EDIT Wygląda na to, że w uchwycie jest coś specjalnego "[". Kiedy uruchamiam LIKE na wsporniku, nie robi to, czego się spodziewam, ale kiedy nie używam nawiasu, LIKE działa w sposób, jakiego oczekuję.

Sprawdź te przykłady:

IF('[' NOT LIKE '[') 
BEGIN 
PRINT '[ is NOT LIKE [' 
END 
ELSE 
BEGIN 
PRINT '[ is LIKE [' 
END 

IF('StackO' NOT LIKE 'StackO') 
BEGIN 
PRINT 'STACKO is NOT LIKE StackO' 
END 
ELSE 
BEGIN 
PRINT 'STACKO is LIKE StackO' 
END 

Oto wyjście z dwóch warunków:

[NIE PODOBA [

STACKO jest jak StackO

+0

Jakakolwiek różnica w przypadku użycia ''[%'' a nie formy z konkatenacją? –

+0

Nie. Nie ma różnicy. Pierwsza próba Użyłem twojej wersji W wypróbowaniu innej składni zapomniałem przenieść ją z powrotem do og '[%] przed publikacją – Jed

Odpowiedz

5

wierzę, może to oznaczać, że „[” jest faktycznie częścią składni operatorów podobne, jak zdefiniowano tutaj: http://msdn.microsoft.com/en-us/library/ms179859.aspx

Trzeba określić charakter ucieczki do ucieczki [coś takiego:

DECLARE @thing nvarchar(20) 
SET @thing = '[55555' 
IF(@thing NOT LIKE '\[%' ESCAPE '\') 
BEGIN 
SET @thing = '[' + @thing 
END 
PRINT @thing 

alternatywnym rozwiązaniem jest następujący:

DECLARE @thing nvarchar(20) 
SET @thing = '[55555' 
IF(LEFT(@thing,1) <> '[') --If the value does not start with [ then add it 
BEGIN 
SET @thing = '[' + @thing 
END 
PRINT @thing 
2

Aby zadziałaj, zmień czek na

Powodem, dla którego nie działa, jest to, że [jest specjalnym znakiem w stylu. tak jak% to. Zobacz here

+0

Dziękuję za twoją odpowiedź - zauważysz, że wszyscy mieliście tę samą zasadniczą odpowiedź i ponieważ mogłem tylko wybierz jedną, losowo wybrałem Tom. – Jed

2

postaci wspornika ([ i ]) are special wildcard characters in T-SQL. Aby wyszukać te literalne znaki, musisz uciec od tych znaków (wskazać, że chcesz szukać tych literalnych znaków, zamiast używać ich jako symboli wieloznacznych). Użyj ESCAPE to zrobić, tak jak poniżej:

DECLARE @thing nvarchar(20) 
SET @thing = '[55555' 
-- pick an escape character you won't see in your content 
IF(@thing NOT LIKE '![' + '%' ESCAPE '!') 
BEGIN 
    SET @thing = '[' + @thing 
END 
PRINT @thing 

Drukuje [55555.

Od MSDN:

można wyszukiwać ciągi znaków, które obejmują jeden lub więcej szczególnych znaków wieloznacznych ... Aby wyszukać znakiem procentu jako postać zamiast jako symbol wieloznaczny, ucieczka należy podać słowo kluczowe i znak escape. Na przykład przykładowa baza danych zawiera kolumnę o nazwie comment, która zawiera tekst 30%. Aby wyszukać wiersze zawierające ciąg 30% w dowolnym miejscu kolumny comment, należy określić klauzulę WHERE, taką jak WHERE comment LIKE '%30!%%' ESCAPE '!'.

+0

Dziękuję za odpowiedź - zauważysz, że wszyscy mieliście tę samą zasadniczą odpowiedź, a ponieważ mogłem wybrać tylko jedną, losowo wybrałem Toma. – Jed

0

Musisz uciec od znaków specjalnych (nawiasach, pojedynczych cudzysłowów itp.). W tym przypadku, można to zrobić:

LIKE '[[' 

EDIT:

PS - [jest znakiem specjalnym, ponieważ może on być stosowany do symboli wieloznacznych, takich jak to: LIKE '[0-9]' zrobić wzór dopasowywania. (W tym przypadku dopasowanie jest podobne do wyrażenia regularnego - dowolna cyfra między 0 a 9.