2009-07-02 19 views
31

Como creo que esta debería ser una pregunta básica, sé que esta pregunta probablemente se haya realizado, pero no puedo encontrarla. Probablemente voy a ganar mi insignia de Presión de Pares, pero lo preguntaré de todos modos:Servidor SQL usando comodín dentro de IN

¿Hay alguna forma en SQL Server que no conozco para usar el carácter comodín% cuando uso IN.

que se dan cuenta de que puedo usar Oregón como:

select * 
from jobdetails 
where job_no like '0711%' or job_no like '0712%' 

y en algunos casos puedo utilizar una subconsulta como:

select * 
from jobdetails 
where job_no in (select job_no from jobs where job_id = 39) 

pero estoy buscando hacer algo como lo siguiente:

select * 
from jobdetails 
where job_no in ('0711%', '0712%') 

En este caso, utiliza el signo de porcentaje como un carácter en lugar de un carácter comodín por lo que no r Ows son devueltos. Actualmente solo uso un montón de quirófanos cuando tengo que hacer esto, pero sé que tiene que haber una mejor manera. ¿Qué método usas para esto?

Respuesta

19

¿Qué tal:

WHERE LEFT(job_no, 4) IN ('0711', '0712', ...) 
+4

. Agradezco su respuesta y eso sí funciona, pero esto probablemente se deba a la simplificación de mi ejemplo. Me gustaría algo que no dependiera necesariamente de los primeros 4 caracteres. Estoy buscando algo que dependa más del comodín. Gracias de nuevo. – Dusty

+1

Esta parece ser la mejor respuesta hasta ahora, al menos en mi caso. esto coincidirá con cualquier valor que comience con el texto especificado en la lista, y hace que sea mucho más fácil agregar entradas (necesito una lista de 100 entradas, por lo que la mayoría de las otras soluciones son demasiado detalladas) –

5

Usted podría intentar algo como esto:

select * 
from jobdetails 
where job_no like '071[12]%' 

No es exactamente lo que estás pidiendo, pero tiene el mismo efecto, y es flexible en otras formas también :)

+0

Esto es bastante parecido a lo que era buscando. ¿Se pueden ampliar los valores entre las comillas para valores múltiples (Ej '071 [10,22]%') y tiene un enlace que explica esto en detalle? – Dusty

+1

@Dusty: No, '071 [10,22]% coincidirá con cualquier cadena' 071x%, donde x es uno de 1 0, o 2. No busca un 071 seguido de 10 o 22. Consulte la sección de patern en : http://msdn.microsoft.com/en-us/library/ms179859.aspx –

+0

+1 aunque esto no es exactamente lo que estoy buscando, pero está cerca y es útil. Aunque probablemente sea lo más cercano a lo que estaba buscando, no puedo marcarlo exactamente como la respuesta. Gracias – Dusty

3
SELECT c.* FROM(
SELECT '071235' AS token UNION ALL SELECT '07113' 
UNION ALL SELECT '071343' 
UNION ALL SELECT '0713SA' 
UNION ALL SELECT '071443') AS c 
JOIN (
SELECT '0712%' AS pattern UNION ALL SELECT '0711%' 
UNION ALL SELECT '071343') AS d 
ON c.token LIKE d.pattern 

071235 
07113 
071343 
1

El operador IN no es más que una fantasía OR de c '=' omparisons. De hecho, es tan 'nada' que en SQL 2000 hubo un error de desbordamiento de pila debido a la expansión del IN en OR s cuando la lista contenía aproximadamente 10k entradas (sí, hay personas escribiendo entradas 10k IN ...). Entonces no puedes usar ningún comodín coincidente.

+1

> 10K IN ... * Estremecimiento * –

+0

10k ANDs http://support.microsoft.com/kb/224581, 255 UNION ALL: http://support.microsoft.com/kb/892141 –

+0

Creo que ahora mismo sobre la insignia de Presión entre iguales. Espero no tener que preocuparme por eso. :) – Dusty

-1

Tiene la respuesta justo ahí en su pregunta. No se puede pasar directamente al comodín cuando se utiliza IN. Sin embargo, puede usar una subconsulta.

Prueba esto:

select * 
from jobdetails 
where job_no in (
select job_no 
from jobdetails 
where job_no like '0711%' or job_no like '0712%') 
) 

sé que esto parece una locura, ya que sólo puede pegarse a la utilización o en su cláusula WHERE. ¿por qué la subconsulta? Sin embargo, el enfoque de subconsulta será útil cuando tenga que hacer coincidir detalles de una fuente diferente.

Raj

+0

¿Por qué necesitaría la subconsulta y en su lugar simplemente colocar la subconsulta o como la consulta principal o? – Dusty

10

¿Qué tal algo como esto?

declare @search table 
(
    searchString varchar(10) 
) 

-- add whatever criteria you want... 
insert into @search select '0711%' union select '0712%' 

select j.* 
from jobdetails j 
    join @search s on j.job_no like s.searchString 
+1

Y, como en la respuesta de AlexKuznetsov, también puede hacerlo en una consulta sin la tabla variable o la tabla temporal. – GalacticCowboy

+0

Este es un enfoque interesante que no había pensado. Probablemente funcione más rápido que un grupo de quirófanos, pero probablemente sea más rápido escribir (copiar y pegar) los quirófanos. Por lo general, solo lo hago si necesito un informe ad hoc para alguien, así que, en general, la razón por la que quiero hacer esto es para ahorrar tiempo de tipeo. – Dusty

0

En Access SQL, yo usaría esto. Me imagino que SQLserver tiene la misma sintaxis.

seleccione * de JobDetails donde job_no como "0711 *" o job_no como "0712 *"

+0

Agradezco su respuesta, pero estoy tratando de encontrar una manera de usar el comodín en una IN para que no tenga que hacer varias OR. – Dusty

-2

probar este

select * 
from jobdetails 
where job_no between '0711' and '0713' 

el único problema es que job '0713' va a ser devuelto, así por lo que puede utilizar '07299999999999' o simplemente añadir and job_no <> '0713'

Dan zamir

9

Creo que tengo una solución a lo que el autor de esta consulta quería en forma simple. Funciona para mí y en realidad es la razón por la que vine aquí para empezar. Creo que solo usar paréntesis alrededor de la columna como '% text%' en combinación con OR s lo hará.

select * from tableName 
where (sameColumnName like '%findThis%' or sameColumnName like '%andThis%' or 
sameColumnName like '%thisToo%' or sameColumnName like '%andOneMore%') 
2
  1. en primer lugar me añaden uno fuera de la mesa estática con todas las posibilidades de mi comodín resultados (esta empresa tiene un código nvarchar 4 carácter de sus localidades y Comodín sus locales) es decir, que pueden tener 456? lo que les daría 456 [1] a 456 [Z] es decir 0-9 & a-z

  2. que tenía que escribir un guión para tirar del usuario actual (declarar) y tire de las máscaras para el usuario declarado.

  3. Cree algunas tablas temporales sólo los básicos para clasificar los números de fila para este usuario actual

  4. bucle a través de cada resultado (SU O tal o cual etc ...)

  5. insertar en la prueba Mesa.

Aquí está la escritura que utilicé:

Drop Table #UserMasks 
Drop Table #TESTUserMasks 

Create Table #TESTUserMasks (
    [User] [Int] NOT NULL, 
    [Mask] [Nvarchar](10) NOT NULL) 

Create Table #UserMasks (
    [RN] [Int] NOT NULL, 
    [Mask] [Nvarchar](10) NOT NULL) 

DECLARE @User INT 
SET @User = 74054 

Insert Into #UserMasks 
select ROW_NUMBER() OVER (PARTITION BY ProntoUserID ORDER BY Id DESC) AS RN, 
     REPLACE(mask,'?','') Mask 
from dbo.Access_Masks 
where prontouserid = @User 

DECLARE @TopFlag INT 
SET @TopFlag = 1 

WHILE (@TopFlag <=(select COUNT(*) from #UserMasks)) 
BEGIN 
    Insert Into #TestUserMasks 
    select (@User),Code from dbo.MaskArrayLookupTable 
    where code like (select Mask + '%' from #UserMasks Where RN = @TopFlag) 

    SET @TopFlag = @TopFlag + 1 
END 
GO 

select * from #TESTUserMasks 
3

que tenía un objetivo similar - y llegó a esta solución:

select * 
from jobdetails as JD 
where not exists (select code from table_of_codes as TC 
         where JD.job_no like TC.code) 

Estoy asumiendo que sus distintos códigos (' 0711% ',' 0712% ', etc.), incluido el%, se almacenan en una tabla, a la que estoy llamando * table_of_codes *, con el campo código.

Si el% no está almacenado en la tabla de códigos, simplemente concatene el '%'. Por ejemplo:

select * 
from jobdetails as JD 
where not exists (select code from table_of_codes as TC 
         where JD.job_no like concat(TC.code, '%')) 

La función concat() puede variar según la base de datos en particular, hasta donde yo sé.

Espero que ayude.Me adaptado de:

http://us.generation-nt.com/answer/subquery-wildcards-help-199505721.html

-2

Esto podría mí la más sencilla utilización solución like any

select * 
from jobdetails 
where job_no like any ('0711%', '0712%') 

En Teradata esto funciona bien.

+3

¿Es como 'como cualquier' parte del lenguaje SQL estándar? No puedo usarlo – corpico

0

Como Jeremy Smith lo publicó, voy a recapitular, ya que no pude responder a esa pregunta en particular suya.

select * 
from jobdetails 
where job_no like '071[1-2]%' 

Si sólo necesita 0711% y 0712% también se puede colocar a está comprendido dentro de los corchetes. Para la palabra clave NOT también puede usar [^1-2]%