提问人:tslee 提问时间:11/22/2022 最后编辑:Thomas Dickeytslee 更新时间:3/24/2023 访问量:337
在 ANSI SQL (IMPALA SQL) 上的多个列中选择位置
selecting where in multiple columns on ANSI SQL (IMPALA SQL)
问:
它在 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 中进行流畅的操作。
答:
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 快得多。
上一个:列定义的范围内的总和
评论