web-dev-qa-db-fra.com

Clause 'In' dans SQL Server avec plusieurs colonnes

J'ai un composant qui récupère les données de la base de données en fonction des clés fournies. Cependant, je souhaite que mon application Java obtienne toutes les données de toutes les clés d'une même base de données afin d'accélérer les choses. I peut utiliser la clause 'in' quand je n'ai qu'une seule clé.

En travaillant sur plusieurs clés, je peux utiliser la requête ci-dessous dans Oracle

SELECT * FROM <table_name> 
where (value_type,CODE1) IN (('I','COMM'),('I','CORE'));

qui est similaire à l'écriture

SELECT * FROM <table_name> 
where value_type = 1 and CODE1 = 'COMM' 

et

SELECT * FROM <table_name> 
where value_type = 1 and CODE1 = 'CORE' 

ensemble

Cependant, ce concept d'utilisation de la clause 'in' comme ci-dessus donne l'erreur ci-dessous dans 'serveur SQL'

ERROR:An expression of non-boolean type specified in a context where a condition is expected, near ','.

S'il vous plaît laissez savoir si leur est un moyen d'atteindre le même objectif dans SQL Server.

9
Ravi

Cette syntaxe n'existe pas dans SQL Server. Utilisez une combinaison de And et Or.

SELECT * 
FROM <table_name> 
WHERE 
  (value_type = 1 and CODE1 = 'COMM')
  OR (value_type = 1 and CODE1 = 'CORE') 

(Dans ce cas, vous pourriez le raccourcir, car value_type est comparé à la même valeur dans les deux combinaisons. Je voulais simplement montrer le modèle qui fonctionne comme IN dans Oracle avec plusieurs champs.)


Lorsque vous utilisez IN avec une sous-requête, vous devez la reformuler comme suit:

Oracle:

SELECT * 
FROM foo 
WHERE 
  (value_type, CODE1) IN (
    SELECT type, code 
    FROM bar
    WHERE <some conditions>)

Serveur SQL:

SELECT * 
FROM foo 
WHERE 
  EXISTS (
    SELECT * 
    FROM bar 
    WHERE <some conditions>
      AND foo.type_code = bar.type 
      AND foo.CODE1 = bar.code)

Selon le cas, il existe d'autres moyens de le faire, comme les jointures internes, etc.

5
Stefan Steinegger

Je pense que vous pouvez essayer ceci en combinant and et or en même temps.

SELECT 
  * 
FROM 
  <table_name> 
WHERE 
  value_type = 1 
  AND (CODE1 = 'COMM' OR CODE1 = 'CORE')
1
JTR

Une meilleure solution consiste à éviter de coder en dur vos valeurs et de les placer ensuite dans un tableau temporaire ou persistant:

CREATE TABLE #t (ValueType VARCHAR(16), Code VARCHAR(16))

INSERT INTO #t VALUES ('I','COMM'),('I','CORE')

SELECT DT. * 
FROM <table_name> DT 
JOIN #t T ON T.ValueType = DT.ValueType AND T.Code = DT.Code

Ainsi, vous évitez de stocker des données dans votre code (version de table persistante) et vous permettez de modifier facilement les filtres (sans changer le code).

1
Alexei

Ce que vous pouvez faire est de "joindre" les colonnes en tant que chaîne et de transmettre vos valeurs également combinées en tant que chaînes.

where (cast(column1 as text) ||','|| cast(column2 as text)) in (?1)

L'autre façon est de faire plusieurs ands et ors.

0
Marcel

J'ai eu un problème similaire dans MS SQL, mais un peu différent. Peut-être que cela aidera quelqu'un à l'avenir, dans mon cas, j'ai trouvé cette solution (pas de code complet, mais un exemple):

SELECT Table1.Campaign
      ,Table1.Coupon
  FROM [CRM].[dbo].[Coupons] AS Table1 
  INNER JOIN [CRM].[dbo].[Coupons] AS Table2 ON Table1.Campaign = Table2.Campaign AND Table1.Coupon = Table2.Coupon
  WHERE Table1.Coupon IN ('0000000001', '0000000002') AND Table2.Campaign IN ('XXX000000001', 'XYX000000001')

Bien sûr, sur Coupon et Campagne dans le tableau, j’ai un index pour une recherche rapide.

0
gladluter

Normalement, vous ne pouvez pas le faire, mais vous pouvez utiliser la technique suivante.

SELECT * FROM <table_name> 
where (value_type+'/'+CODE1) IN (('I'+'/'+'COMM'),('I'+'/'+'CORE'));
0
user3706939

IN Clause

Query

SELECT * FROM [table_name]
WHERE value_type IN (1)
AND CODE1 IN ('COMM', 'CORE');

OU

SELECT * FROM [Table_Name]
WHERE value_type = 1
AND (CODE1 = 'COMM' OR CODE1 = 'CORE');
0
Ullas