我在做NetezzaSQL。
假设我有3个表位于一个服务器上(例如在真实的生活中,可能存在许多这样表,且每个表具有许多行和许多列):
- 表1:col 1、col 2、col 3
- 表2:col 4、col 5、col 6
- 表3:col 7、col 8、col 9
- 等等的。
**我的问题:**我试图找出哪些表中的哪些列包含值%LIKE%“ABC”(即如果列中的行包含%LIKE%“ABC”值)
我想,也许一起使用R/SQL可能是解决这个问题的更好方法,因为我不认为有一种方法可以专门使用Netezza SQL(也许这是可能的动态查询,但这看起来非常困难。
**步骤1:**我已经在一个表中有了这个信息(使用Netezza内置的information_schema.column
表创建):
# I re-created this for the stackoverflow example
table_name = c("table1","table1", "table1", "table2","table2", "table2", "table3", "table3", "table3")
col_name = c("col1","col2", "col3", "col4", "col5", "col6","col7", "col8", "col9")
summary = data.frame(table_name, col_name)
table_name col_name
1 table1 col1
2 table1 col2
3 table1 col3
4 table2 col4
5 table2 col5
6 table2 col6
7 table3 col7
8 table3 col8
9 table3 col9
**步骤2:**我创建了一列SQL查询,我将发送:
# generate a column of SQL queries to be sent
summary$queries = SQL(paste0("select * from ", summary$table_name, " where ", "summary$col_name " ," LIKE %abc%"))
table_name col_name queries
1 table1 col1 select * from table1 where summary$col_name LIKE %abc%
2 table1 col2 select * from table1 where summary$col_name LIKE %abc%
3 table1 col3 select * from table1 where summary$col_name LIKE %abc%
4 table2 col4 select * from table2 where summary$col_name LIKE %abc%
5 table2 col5 select * from table2 where summary$col_name LIKE %abc%
6 table2 col6 select * from table2 where summary$col_name LIKE %abc%
7 table3 col7 select * from table3 where summary$col_name LIKE %abc%
8 table3 col8 select * from table3 where summary$col_name LIKE %abc%
9 table3 col9 select * from table3 where summary$col_name LIKE %abc%
**第三步:**接下来,我写了下面的R代码:
#import libraries
library(odbc)
library(DBI)
# connect
my_con <- dbConnect(odbc:: odbc()...)
# create for loop
my_list = list()
for (i in 1:nrow(summary)) {
tryCatch({
is_null_i = dbExecute(my_con, summary$queries[i])
ifelse(is.null(is_null_i) == "FALSE", my_list[[i]] = is_null_i, NA)
}, error = function(e) {
# ignore error
})
}
**我的问题:**虽然每个单独的dbExecute(my_con, summary$queries[i])
看起来都在运行,但is_null_i并没有看到被创建。
最后,我会寻找这样的输出:
# hypothetical output tables and columns that contain the word %ABC%:
table_name col_name
1 table1 col1
2 table1 col3
3 table3 col7
4 table3 col8
”””有人可以告诉我一个更好的方法来做这个吗?**也许可以只在Netezza这样做?
谢谢!
2条答案
按热度按时间yhived7q1#
我们可以使用DuckDB创建一个小型的内存中测试设置
假设我们有以下三个表:
因此期望输出为
如你所知,我们可以列出数据库“服务器”上的所有表
理论上我们可以使用for循环,但对于这类操作,我更喜欢将内容保存在dataframe中,并依赖于不同的dplyr工具。首先,我们可以使用
enframe
将表名列表移动到tibble中,并建立到不同远程表的连接。可以这样做:现在我们有了一个列,其中包含到duckdb表的连接列表。我们可以依靠
dbplyr
包为我们做翻译,而不是手动构造查询。我们先从其中一张table开始现在,我们可以像这样对所有远程表重复该操作
为了得到预期的输出,我们只需要过滤和选择
创建于2023-06-12带有reprex v2.0.2
fcy6dtqo2#
如果您不想依赖dbplyr的翻译,另一种选择是自己构造查询。我会建议使用胶水包中的
glue_sql
。使用paste
构造查询通常是一种不好的做法,因为可能会遇到SQL注入的问题。然后你可以发送查询与
DBI::dbGetQuery
。这里你可以使用for循环,但是使用map可能更容易,因为我们已经有了表格格式的数据。然后,您可以得到如下所示的预期结果:
创建于2023-06-12带有reprex v2.0.2