trabajados - Servidor SQL que usa un comodín dentro de IN
not like sql server (13)
Como creo que esta debería ser una pregunta básica, sé que esta pregunta probablemente haya sido formulada, pero no puedo encontrarla. Probablemente esté a punto de ganar mi insignia de Presión de Pares, pero lo preguntaré de todos modos:
¿Hay alguna forma en SQL Server de la que no tengo conocimiento para usar el carácter comodín% cuando uso IN.
Me doy cuenta de que puedo usar OR como:
select *
from jobdetails
where job_no like ''0711%'' or job_no like ''0712%''
y en algunos casos puedo usar 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 se devuelven las filas. 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?
Primero agregué una tabla estática con TODAS las posibilidades de los resultados de mi comodín (esta empresa tiene un código nvarchar de 4 caracteres como sus localidades y comodín para sus locales), es decir, ¿pueden tener 456? que les daría 456 [1] a 456 [Z], es decir, 0-9 y az
Tuve que escribir una secuencia de comandos para atraer al usuario actual (declararlos) y extraer las máscaras para el usuario declarado.
Cree algunas tablas temporales solo básicas para clasificar los números de fila para este usuario actual
recorrer cada resultado (TU O esto O ese, etc.)
Insertar en la Tabla de prueba.
Aquí está el script 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
¿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
Como Jeremy Smith lo publicó, lo resumiré, ya que no pude responder a esa pregunta en particular suya.
select *
from jobdetails
where job_no like ''071[1-2]%''
Si solo necesita 0711%
y 0712%
, también puede colocar rangos entre corchetes. Para la palabra clave NOT
, también puede usar [^1-2]%
Creo que tengo una solución a lo que el creador 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
lo hará.
select * from tableName
where (sameColumnName like ''%findThis%'' or sameColumnName like ''%andThis%'' or
sameColumnName like ''%thisToo%'' or sameColumnName like ''%andOneMore%'')
El operador IN
no es más que una elegante comparación de ''=''. De hecho, es tan "nada más que" que en SQL 2000 hubo un error de desbordamiento de pila debido a la expansión de 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.
En Access SQL, usaría esto. Me imagino que SQLserver tiene la misma sintaxis.
seleccione * from jobdetails donde job_no como "0711 *" o job_no como "0712 *"
Esta podría ser la solución más simple de usar like any
select *
from jobdetails
where job_no like any (''0711%'', ''0712%'')
En Teradata, esto funciona bien.
Podrías probar algo como esto:
select *
from jobdetails
where job_no like ''071[12]%''
No es exactamente lo que estás preguntando, pero tiene el mismo efecto, y también es flexible en otros aspectos :)
Prueba esto
select *
from jobdetails
where job_no between ''0711'' and ''0713''
el único problema es que el job ''0713''
se devolverá, así que puede usar ''07299999999999''
o simplemente agregar and job_no <> ''0713''
Dan zamir
Qué tal si:
WHERE LEFT(job_no, 4) IN (''0711'', ''0712'', ...)
Tenía un objetivo similar, y llegué 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 )
Supongo que sus diversos códigos (''0711%'', ''0712%'', etc.), incluido el%, están almacenados en una tabla, a la que estoy llamando * table_of_codes *, con código de campo.
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. Lo adapté de:
http://us.generation-nt.com/answer/subquery-wildcards-help-199505721.html
Usted tiene la respuesta allí 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 puedes simplemente usar O en tu 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
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