IN子句中的SQL多列

Hta*_*ras 33 sql oracle

如果我们需要根据给定列的某些值集查询表,我们可以简单地使用IN子句.

但是如果需要基于多个列执行查询,我们就不能使用IN子句(在SO线程中使用grep).

从其他SO线程,我们可以使用连接或存在子句等来规避这个问题.但是如果主表和搜索数据都在数据库中,它们都可以工作.

E.g
User table:
firstName, lastName, City
Run Code Online (Sandbox Code Playgroud)

给定(firstname,lastName)元组的列表,我需要获取城市.

我可以想到以下解决方案.

1

构造一个选择查询,如,

SELECT city from user where (firstName=x and lastName=y) or (firstName=a and lastName=b) or .....
Run Code Online (Sandbox Code Playgroud)

2

将所有firstName,lastName值上载到临时表中,并在"用户"表和新登台表之间执行连接.

有没有解决这个问题的方法,一般来说解决这个问题的首选是什么?

xda*_*azz 79

你可以这样做:

SELECT city FROM user WHERE (firstName, lastName) IN (('a', 'b'), ('c', 'd'));
Run Code Online (Sandbox Code Playgroud)

sqlfiddle.

  • 不是*ALL*RDBMS你不能.例如; Oracle可以,但MySQL不行. (5认同)
  • @Dems我是Oracle新手.它是否适用于Oracle中的预准备查询."选择城市FROM用户WHERE(firstName,lastName)IN(?)"和?="('a','b'),('c','d')" (2认同)
  • oracle 11g 支持这个吗?我试过这个,我得到一个错误,无效的关系运算符。 (2认同)

Ale*_*amp 6

一般来说,您可以轻松地编写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)


dan*_*111 5

它通常最终会更容易将数据加载到数据库中,即使它只是运行快速查询.硬编码数据似乎很快进入,但如果您开始进行更改,很快就会变得很痛苦.

但是,如果要将名称直接编码到查询中,请执行以下操作:

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语法;它可能需要对您的系统进行一些调整).


gro*_*ter 5

在 Oracle 中你可以这样做:

SELECT * FROM table1 WHERE (col_a,col_b) IN (SELECT col_x,col_y FROM table2)
Run Code Online (Sandbox Code Playgroud)