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.
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.
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')
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).
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.
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.
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'));
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');