如果我们需要根据给定列的某些值集查询表,我们可以简单地使用IN子句.
但是如果需要基于多个列执行查询,我们就不能使用IN子句(在SO线程中使用grep).
从其他SO线程,我们可以使用连接或存在子句等来规避这个问题.但是如果主表和搜索数据都在数据库中,它们都可以工作.
E.g
User table:
firstName, lastName, City
Run Code Online (Sandbox Code Playgroud)
给定(firstname,lastName)元组的列表,我需要获取城市.
我可以想到以下解决方案.
构造一个选择查询,如,
SELECT city from user where (firstName=x and lastName=y) or (firstName=a and lastName=b) or .....
Run Code Online (Sandbox Code Playgroud)
将所有firstName,lastName值上载到临时表中,并在"用户"表和新登台表之间执行连接.
有没有解决这个问题的方法,一般来说解决这个问题的首选是什么?
xda*_*azz 79
你可以这样做:
SELECT city FROM user WHERE (firstName, lastName) IN (('a', 'b'), ('c', 'd'));
Run Code Online (Sandbox Code Playgroud)
一般来说,您可以轻松地编写Where-Condition,如下所示:
select * from tab1
where (col1, col2) in (select col1, col2 from tab2)
Run Code Online (Sandbox Code Playgroud)
注意
Oracle 会忽略一个或多个所选列为 NULL 的行。在这些情况下,您可能希望使用NVL -Funktion 将 NULL 映射到特殊值(不应出现在值中):
select * from tab1
where (col1, NVL(col2, '---') in (select col1, NVL(col2, '---') from tab2)
Run Code Online (Sandbox Code Playgroud)
它通常最终会更容易将数据加载到数据库中,即使它只是运行快速查询.硬编码数据似乎很快进入,但如果您开始进行更改,很快就会变得很痛苦.
但是,如果要将名称直接编码到查询中,请执行以下操作:
with names (fname,lname) as (
values
('John','Smith'),
('Mary','Jones')
)
select city from user
inner join names on
fname=firstName and
lname=lastName;
Run Code Online (Sandbox Code Playgroud)
这样做的好处是它可以在一定程度上将您的数据从查询中分离出来.
(这是DB2语法;它可能需要对您的系统进行一些调整).
在 Oracle 中你可以这样做:
SELECT * FROM table1 WHERE (col_a,col_b) IN (SELECT col_x,col_y FROM table2)
Run Code Online (Sandbox Code Playgroud)