2010-10-13 21 views
22

Tengo una consulta que es compilación a partir de las entradas del usuario (aprobada a través del formulario html). Parece que (ejemplo sencillo):como '%' no acepta el valor NULO

Select * From [table] Where [table].[column] like '<parameter>' 

Este parámetro puede ser opcional por lo que si el usuario deja campo de entrada correspondiente vacío Paso %. Funcionó bien hasta que encontré valores NULL. Entiendo que los símbolos de coincidencia '%' no son nulos, pero me gustaría considerar NULL como cadena vacía en este caso.

¿Qué debo hacer? Cambiar la consulta (¿cómo?) O pasar otro símbolo (s) cuando el usuario dejó la entrada vacía?

Gracias.

PS. Es un problema real del sistema existente y sé que está lejos de ser una solución óptima, pero tengo que enfrentarlo.

+0

Espero que esté utilizando consultas parametrizadas, ya que es muy posible que su código esté abierto a la Inyección SQL. Ver [boby tables] (http://xkcd.com/327/) – Oded

+0

¿De dónde viene el parámetro? (@Oded: Supongo que eso es lo que se suponía que significaba '' '' ... – Tomalak

+0

@Tomalak - Espero que tenga razón ... – Oded

Respuesta

50

Puede utilizar coalesce para tratar nula como una cadena vacía:

where COALESCE([table].[column],'') like '<parameter>' 

En SQL Server, también puede utilizar IsNull:

where IsNull([table].[column],'') like '<parameter>' 
+0

¿Qué pasa cuando se define un índice en [tabla]. [Columna]? –

3

Creo que esto podría funcionar:

Select * From [table] Where [table].[column] is null or [table].[column] like '<parameter>' 
3

Bueno, ¿qué hay de

SELECT 
    * 
FROM 
    [table] 
WHERE 
    ([table].[column] like <parameter>) OR 
    (<parameter> = '%') 

... para que cuando pase '%', recupere todas las filas, de lo contrario, funciona como lo tiene en este momento.

1

¡Haga dos declaraciones! Si el usuario pasa ningún parámetro de usuario:

Select * From [table] Where [table].[column] like '%' or [table].[column] is null; 
+0

Sorprendentemente, 'NULL'! =' NULL', necesita usar el operador especial 'IS NULL' – Piskvor

+0

Ups! ¡Lo siento! Lo corregí. – Tim

+0

¿No es lo mismo que 'seleccionar * de [tabla]'? – Caramiriel

0

¿qué tal ..

Select * From [table] Where ISNULL([table].[column], '') like '<parameter>' 

Así que esto se llevará a su valor real de la columna, o si eso es nulo una cadena vacía y compararlo aganist su parámetro, asumiendo su servidor ms sql ..

3

isnull ([tabla].[Columna], '') como '%'

funciona como un encanto

0

Basado En Index in Where Clause problema con este enfoque

where COALESCE([table].[column],'') like '<parameter>' 

es:

Si ha utilizado un índice en su [columna], debido a la función COALESCE, SQL Server no puede usar su índice, significa que ha desperdiciado su índice

Y

problema con este enfoque

Where [table].[column] like '%' or [table].[column] is null 

es:

Si el [Tabla] [columna] es nulo, entonces el código será la siguiente:.

Where null like '%' or [table].[column] is null 

e independientemente de segunda parte de la cláusula WHERE ([tabla]. [columna] es nula) el resultado de la evaluación será DESCONOCIDO y el servidor SQL filtrará esa salida.

nulo o True = DESCONOCIDO

nulo o Falso = DESCONOCIDO

Así que este es el optimizado y nula incluido enfoque:

Select * From [table] 
WHERE 
     CASE 
      WHEN [table].[column] IS NULL THEN 1 
      WHEN [table].[column] like '<parameter>' THEN 1 
      ELSE 0 
     END = 1 
+0

Esta respuesta es solo un trozo de código, parece muy similar a otra respuesta. Explique por qué esta es una buena respuesta, cómo funciona el código y cómo se diferencia de las otras respuestas. – AdrianHHH

0

Buenos días, utilice esta solución, creo que es una mezcla de soluciones:

@parameter nvarchar (30) 

if @parameter = '' 
      Begin 
          Set @parameter = '%' 
      End 

select * from [table] as t where ISNULL (t. [column], '') like '%' + @parameter + '%' 

Si solo quieres comenzar con el parámetro, elimina el primer '%' y el signo más

espero que les sea útil

0

quería algo similar, para ser realmente capaces de encontrar '%' (todos) incluyendo nula o una valor específico cuando se ingresa.

Para Oracle isnull no funciona y en mi caso COALESCE tampoco.

que utiliza esta opción en la cláusula where:

where decode(table1.field1,null,' ',table1.field1) like '%' 

espero que funcione para otros.

+0

'coalesce' funciona en Oracle. Su código es equivalente a 'where coalesce (table1.field, '') como '%'' – trincot

Cuestiones relacionadas