例如,如果给出下表
Id Key Value
1 A Alpha
2 B Alpha
3 A Charlie
Run Code Online (Sandbox Code Playgroud)
我接受了输入{(A,Charlie)和(B,Alpha)}并且我要求返回我希望它返回2和3但不是1的所有ID.
做这个的最好方式是什么?我可以将它全部合并到一个查询中(为了速度)还是我必须为我收到的每个值对运行重复查询.
我认为Postgresql有最优雅的解决方案:
SELECT *
FROM T
WHERE ("Key", "Value") IN (('B', 'Alpha'), ('A', 'Charlie'));
Run Code Online (Sandbox Code Playgroud)
在SQL-SERVER 2008及更高版本中,您可以使用VALUES构建元组:
SELECT T.*
FROM T
INNER JOIN
( VALUES
('B', 'Alpha'),
('A', 'Charlie')
) v (Key, Value)
ON v.Key = T.Key
AND v.Value = T.Value
Run Code Online (Sandbox Code Playgroud)
或者对于过程,您可以创建键值对类型并将其作为参数传递:
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;
Run Code Online (Sandbox Code Playgroud)
对于MySQL,我认为您可能只需使用它来构建它 AND/OR
SELECT *
FROM T
WHERE (`Key` = 'A' AND `Value` = 'Charlie')
OR (`Key` = 'B' AND `Value` = 'Alpha')
Run Code Online (Sandbox Code Playgroud)
我对其他DBMS的了解是有限的,所以如果它不是上述抱歉之一,我无法提供更多帮助.
编辑(在a_horse_with_no_name的帮助下)
PostgreSQL语法也适用于Oracle(我认为DB2)
| 归档时间: |
|
| 查看次数: |
2222 次 |
| 最近记录: |