Pregunta Combinación de 'LIKE' y 'IN' utilizando t-sql


¿Cómo puedo hacer este tipo de selección?

SELECT * 
FROM Street 
WHERE StreetName LIKE IN ('% Main Street', 'foo %')

Por favor no me digas que puedo usar OR porque estos en realidad provienen de una consulta.


32
2018-05-23 20:04


origen


Respuestas:


No hay combinados LIKE y IN sintaxis pero puedes usar LIKE a JOIN en su consulta como a continuación.

;WITH Query(Result) As
(
SELECT '% Main Street' UNION ALL
SELECT 'foo %'
)
SELECT DISTINCT s.* 
FROM Street s
JOIN Query q ON StreetName LIKE q.Result

O para usar tu ejemplo en los comentarios

SELECT DISTINCT s.* 
FROM Street s
JOIN CarStreets cs ON s.StreetName LIKE cs.name + '%'
WHERE cs.Streets = 'offroad'

34
2018-05-23 20:08



No tienes muchas opciones aquí.

SELECT * FROM Street Where StreetName LIKE '% Main Street' OR StreetName LIKE 'foo %'

Si esto es parte de una consulta existente y más complicada (que es la impresión que estoy obteniendo), podría crea una función de valor de tabla que hace la verificación por ti.

SELECT * FROM Street Where StreetName IN (dbo.FindStreetNameFunction('% Main Street|foo %'))

Yo recomendaría usar la solución más simple (la primera). Si esto está anidado dentro de una consulta más grande y complicada, publíquelo y lo analizaremos.


4
2018-05-23 20:13



Puede recurrir a Dynamic SQL y finalizar todo en un procedimiento almacenado.

Si obtienes el parámetro LIKE IN en una cadena como tokens con un cierto separador, como

'% Main Street,foo %,Another%Street'

primero necesita crear una función que reciba una lista de LIKE "tokens" y devuelve una tabla de ellos.

CREATE FUNCTION [dbo].[SplitList]
(
  @list nvarchar(MAX),
  @delim nvarchar(5)
)  
RETURNS @splitTable table 
(       
  value nvarchar(50)
) 
AS BEGIN
  While (Charindex(@delim, @list)>0) Begin 
    Insert Into @splitTable (value)
      Select ltrim(rtrim(Substring(@list, 1, Charindex(@delim, @list)-1))) 
    Set @list = Substring(@list, Charindex(@delim, @list)+len(@delim), len(@list))
  End     
  Insert Into @splitTable (value) Select ltrim(rtrim(@list))
  Return
END 

Luego en el SP tienes el siguiente código

declare 
  @sql nvarchar(MAX),
  @subWhere nvarchar(MAX)
  @params nvarchar(MAX)

-- prepare the where sub-clause to cover LIKE IN (...)
-- it will actually generate where sub clause StreetName Like option1 or StreetName Like option2 or ...   
set @subWhere = STUFF(
  (
    --(**)
    SELECT ' OR StreetName like ''' + value + '''' FROM SplitList('% Main Street,foo %,Another%Street', ',') 
      FOR XML PATH('')
  ), 1, 4, '')

-- create the dynamic SQL
set @sql ='select * from [Street]
  where 
    (' + @subWhere + ')
    -- and any additional query params here, if needed, like
    AND StreetMinHouseNumber = @minHouseNumber
    AND StreetNumberOfHouses between (@minNumberOfHouses and @maxNumberOfHouses)'

set @params = ' @minHouseNumber nvarchar(5),
  @minNumberOfHouses int,
  @minNumberOfHouses int'     

EXECUTE sp_executesql @sql, @params,    
  @minHouseNumber,
  @minNumberOfHouses,
  @minNumberOfHouses     

Por supuesto, si tiene sus parámetros LIKE IN en otra tabla o los reúne a través de una consulta, puede reemplazarlos en línea (**)


1
2018-06-15 15:16



Creo que puedo aclarar lo que él está buscando, pero no sé la respuesta. Usaré mi situación para demostrar. Tengo una tabla con una columna llamada "Query" que contiene consultas SQL. Estas consultas a veces contienen nombres de tablas de una de mis bases de datos. Necesito encontrar todas las filas de Query que contengan nombres de tabla de una base de datos particular. Entonces, puedo usar el siguiente código para obtener los nombres de la tabla:

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

Intento utilizar una cláusula WHERE IN para identificar las filas de consulta que contienen los nombres de tabla que me interesan:

SELECT *
  FROM [DatasourceQuery]
 WHERE Query IN LIKE
(
    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
)

Creo que OP está intentando hacer algo como eso.


0
2017-07-12 11:39