在 ANSI SQL (IMPALA SQL) 上的多个列中选择位置

selecting where in multiple columns on ANSI SQL (IMPALA SQL)

提问人:tslee 提问时间:11/22/2022 最后编辑:Thomas Dickeytslee 更新时间:3/24/2023 访问量:337

问:

它在 Oracle SQL 中正常工作,但在 ANSI SQL 中不起作用。

SELECT whatever WHERE (col1,col2) IN ((val1, val2), (val1, val2), ...)

如何在 ANSI SQL (IMPALA SQL) 中编写代码?

我不想要以下代码,因为有很多列表。

WHERE (col1 = val1a AND col2 = val2a)
   OR (col1 = val1b AND col2 = val2b)
   ...

谢谢!

(例如)https://dba.stackexchange.com/questions/34266/selecting-where-two-columns-are-in-a-set

我们可以在 ANSI sql 中进行流畅的操作。

python sql where-clause impala ansi-sql

评论

0赞 jarlh 11/22/2022
Oracle 方式符合 ANSI SQL(使用可选功能 F641、行和表构造函数、T051、行类型和 F561、全值表达式)。经 developer.mimer.com/sql-2016-validator 验证。
0赞 jarlh 11/22/2022
要么坚持使用当前的解决方法,要么将值放在(临时)表中并执行 JOIN。

答:

0赞 Koushik Roy 11/22/2022 #1

这在 hive 或 impala 中是不可能的。只有“其他”解决方法是 concat()。
您可以使用下面的 sql-

...
where concat(col1,'~',col2) IN (concat(val1,'~',val2),concat(val3,'~',val4)...)

请注意,如果 col1/col2 为 null,则不会匹配。

编辑:这可能会有严重的性能问题。因此,您可以将 val1,val2 存储在静态/查找表中,然后使用它与主表联接,如下所示 -

select ...
from table1 t1
join table2 t2 on t1.col1=t2.val1 and t1.col2=t2.val2

您还可以根据将来的需要灵活地更改值,而不更改 sql。

评论

0赞 tslee 11/22/2022
但这需要很长时间......
0赞 Koushik Roy 11/22/2022
任何类型的元组连接都需要时间。我会连接它们并将值放入表中并进行比较 - 比 concat 和 in 子句更快。or
0赞 jarlh 11/22/2022
请注意,但是 .此外,像这样的冒险技巧会使查询更难优化,从而导致性能不佳。concat('ab', 'c') = concat('a', 'bc')('ab', 'c') <> ('a', 'bc')
0赞 Koushik Roy 11/22/2022
这是一个很好的观点,所以我正在更改答案并添加一个分隔符。
0赞 Koushik Roy 11/22/2022
请问您能检查一下解决方案吗?比 concat 快得多。