web-dev-qa-db-fra.com

SQL Server utilisant un caractère générique dans IN

É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?

37
Dusty

Que diriez-vous:

WHERE LEFT(job_no, 4) IN ('0711', '0712', ...)
24
Aaron Alton

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 ORs le fera.

select * from tableName
where (sameColumnName like '%findThis%' or sameColumnName like '%andThis%' or 
sameColumnName like '%thisToo%' or sameColumnName like '%andOneMore%') 
10
notYetExpert

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
10
GalacticCowboy

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 :)

6
Jeremy Smyth

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

3
Julian
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
3
A-K
  1. 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

  2. J'ai dû écrire un script pour extraire l'utilisateur actuel (les déclarer) et extraire les masques de l'utilisateur déclaré.

  3. Créez des tables temporaires juste de base pour classer les numéros de ligne pour cet utilisateur actuel

  4. parcourir chaque résultat (VOTRE ou ceci ou cela etc ...)

  5. 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
2
Tim

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 ORs 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.

1
Remus Rusanu

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]%

1
Dan Mihalea

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 *"

0
PowerUser