Je pense que Postgresql a la solution la plus élégante :
SELECT *
FROM T
WHERE ("Key", "Value") IN (('B', 'Alpha'), ('A', 'Charlie'));
Dans SQL-SERVER 2008 et versions ultérieures, vous pouvez utiliser VALUES
pour construire vos tuples :
SELECT T.*
FROM T
INNER JOIN
( VALUES
('B', 'Alpha'),
('A', 'Charlie')
) v (Key, Value)
ON v.Key = T.Key
AND v.Value = T.Value
Ou pour une procédure, vous pouvez créer un type de paire clé-valeur et le passer en paramètre :
CREATE TYPE KeyValuePair AS TABLE ([Key] VARCHAR(1), [Value] VARCHAR(7));
DECLARE @T AS KeyValuePair
INSERT @T
VALUES
('B', 'Alpha'),
('A', 'Charlie')
SELECT T.*
FROM T
INNER JOIN @T v
ON v.[Key] = T.[Key]
AND v.Value = T.Value;
Pour MySQL, je pense que vous devrez peut-être simplement le construire en utilisant AND/OR
SELECT *
FROM T
WHERE (`Key` = 'A' AND `Value` = 'Charlie')
OR (`Key` = 'B' AND `Value` = 'Alpha')
Ma connaissance des autres SGBD est limitée, donc si ce n'est pas l'un des ci-dessus, désolé, je ne peux pas être plus utile.
EDIT (Avec l'aide de a_horse_with_no_name )
La syntaxe PostgreSQL fonctionne également pour Oracle (et je pense DB2)