2011-07-22 19 views
6

Estoy tratando de capturar un nombre de variable T-SQL al asegurarme de que el valor de la variable esté prefijado con un paréntesis "[".¿Por qué el operador T-SQL "LIKE" no evalúa esta expresión como creo que debería?

Aquí hay un ejemplo de cómo estoy tratando de hacer esto:

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 

El ejemplo anterior de imprimir Nota [[55555

que el valor original de @thing se prefija con el soporte "[". Esperaba que la condición IF hubiera resultado falsa desde "[55555" is LIKE '[' + '%'

¿Por qué la condición IF no devuelve falso? Y, lo que es más importante, supongo, ¿cuál es la sintaxis correcta para verificar la existencia de una cadena que aparece al comienzo de un valor de cadena variable?

EDIT Parece que hay algo especial acerca del soporte "[". Cuando ejecuto LIKE en un paréntesis, no hace lo que esperaba, pero cuando no uso un paréntesis, LIKE funciona de la manera que espero.

Salida estos ejemplos:

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 

Aquí está la salida de las dos condiciones:

[no es como [

STACKO es como STACKO

+0

Cualquier diferencia si usa ''[%'' y no la forma con concatenación? –

+0

No. Sin diferencia. En realidad, en mi primer intento que utilicé su versión. Al intentar una sintaxis diferente, me olvidé de volver a colocarla en el og '[%' antes de publicar. – Jed

Respuesta

5

Creo que puede ser porque '[' es en realidad parte de la sintaxis de los operadores similares, tal como se define aquí: http://msdn.microsoft.com/en-us/library/ms179859.aspx

Es necesario definir un carácter de escape para escapar del [, así:

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

Una solución alternativa sería la siguiente:

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

Para hazlo funcionar cambia tu cheque a

IF (SUBSTRING(@thing, 1,1) != '[') 

La razón por la que no funciona es porque [es un char especial en el estilo. al igual que% es. Veo here

+0

Gracias por su respuesta - Notará que todos tenían la misma respuesta de principios y que solo podía hacerlo elige uno, escogí al azar Tom. – Jed

2

caracteres ménsula ([ y 0.123.) are special wildcard characters in T-SQL. Para buscar esos caracteres literales, querrá escapar de esos caracteres (indique que desea buscar esos caracteres literales, en lugar de emplearlos como comodines). Utilice ESCAPE para hacer esto, así:

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 

Esto imprime [55555.

De MSDN:

Puede buscar cadenas de caracteres que incluyen uno o más de los caracteres comodín especiales ... para buscar el signo de porcentaje como un personaje en lugar de como un carácter comodín, el ESCAPE la palabra clave y el carácter de escape deben ser proporcionados. Por ejemplo, una base de datos de ejemplo contiene una columna llamada comment que contiene el texto 30%. Para buscar cualquier fila que contenga la cadena 30% en cualquier lugar de la columna comment, especifique una cláusula WHERE como WHERE comment LIKE '%30!%%' ESCAPE '!'.

+0

Gracias por tu respuesta - Notarás que todos tienen la misma respuesta de principios y como solo pude elegir uno, escogí al azar a Tom. – Jed

0

Tiene que escapar de los caracteres especiales (corchetes, comillas simples, etc.). En este caso, usted puede hacer esto:

LIKE '[[' 

EDIT:

PS - [es un carácter especial, ya que se puede utilizar para comodines, como esto: LIKE '[0-9]' a hacer de coincidencia de patrones. (En este caso, la coincidencia es como una expresión regular - cualquier dígito entre 0 y 9.

Cuestiones relacionadas