Étant donné que je pense que cela devrait être une question fondamentale, je sais que cette question a probablement été posée, mais je ne parviens pas à la trouver. Je suis probablement sur le point de gagner mon badge Peer Pressure, mais je vais quand même demander:
Existe-t-il un moyen dans SQL Server que je ne connais pas pour utiliser le caractère générique% lors de l'utilisation de IN.
Je me rends compte que je peux utiliser des OR comme:
select *
from jobdetails
where job_no like '0711%' or job_no like '0712%'
et dans certains cas, je peux utiliser une sous-requête comme:
select *
from jobdetails
where job_no in (select job_no from jobs where job_id = 39)
mais je cherche à faire quelque chose comme ceci:
select *
from jobdetails
where job_no in ('0711%', '0712%')
Dans ce cas, il utilise le signe de pourcentage en tant que caractère au lieu d'un caractère générique afin qu'aucune ligne ne soit renvoyée. J'utilise actuellement juste un tas de OR quand je dois le faire, mais je sais qu'il doit y avoir une meilleure façon. Quelle méthode utilisez-vous pour cela?
Que diriez-vous:
WHERE LEFT(job_no, 4) IN ('0711', '0712', ...)
Je pense avoir une solution à ce que l'auteur de cette enquête voulait sous une forme simple. Cela fonctionne pour moi et c'est en fait la raison pour laquelle je suis venu ici pour commencer. Je pense que l'utilisation de parenthèses autour de la colonne comme '% text%' en combinaison avec OR
s le fera.
select * from tableName
where (sameColumnName like '%findThis%' or sameColumnName like '%andThis%' or
sameColumnName like '%thisToo%' or sameColumnName like '%andOneMore%')
Que diriez-vous quelque chose comme ça?
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
Vous pouvez essayer quelque chose comme ceci:
select *
from jobdetails
where job_no like '071[12]%'
Pas exactement ce que vous demandez, mais cela a le même effet et est flexible à d'autres égards aussi :)
J'avais un objectif similaire - et je suis arrivé à cette solution:
select *
from jobdetails as JD
where not exists ( select code from table_of_codes as TC
where JD.job_no like TC.code )
Je suppose que vos différents codes ('0711%', '0712%', etc.), y compris le%, sont stockés dans une table, que j'appelle * table_of_codes *, avec le champ code .
Si le% n'est pas stocké dans la table des codes, il suffit de concaténer le '%'. Par exemple:
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 fonction concat () peut varier en fonction de la base de données particulière, pour autant que je sache.
J'espère que ça aide. Je l'ai adapté de:
http://us.generation-nt.com/answer/subquery-wildcards-help-199505721.html
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
J'ai tout d'abord ajouté un tableau statique avec TOUTES les possibilités de mes résultats génériques (cette société a un code nvarchar à 4 caractères comme leurs localités et ils génèrent leurs habitants) c'est-à-dire qu'ils peuvent en avoir 456? ce qui leur donnerait 456 [1] à 456 [Z] soit 0-9 & a-z
J'ai dû écrire un script pour extraire l'utilisateur actuel (les déclarer) et extraire les masques de l'utilisateur déclaré.
Créez des tables temporaires juste de base pour classer les numéros de ligne pour cet utilisateur actuel
parcourir chaque résultat (VOTRE ou ceci ou cela etc ...)
Insérez dans la table de test.
Voici le script que j'ai utilisé:
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
L'opérateur IN
n'est rien d'autre qu'une fantaisie OR
de comparaisons '='. En fait, c'est tellement "rien que" que dans SQL 2000 il y avait un bogue de débordement de pile dû à l'expansion du IN
en OR
s lorsque la liste contenait environ 10k entrées (oui, il y a des gens écriture de 10 000 entrées IN ...). Vous ne pouvez donc pas utiliser de correspondance générique.
Comme Jeremy Smith l'a posté, je vais récapituler, car je n'ai pas pu répondre à sa question particulière.
select *
from jobdetails
where job_no like '071[1-2]%'
Si vous avez juste besoin de 0711%
et 0712%
vous pouvez également placer une plage entre crochets. Pour le mot clé NOT
, vous pouvez également utiliser [^1-2]%
Dans Access SQL, j'utiliserais cela. J'imagine que SQLserver a la même syntaxe.
sélectionnez * dans les détails du travail où job_no comme "0711 *" ou job_no comme "0712 *"