我在vertica数据库Mytable
中有以下数据:
+----+-------+
| ID | Value |
+----+-------+
| A | 5 |
| B | 9 |
| C | 10 |
| D | 7 |
+----+-------+
我正在尝试在python中创建一个查询来访问vertica数据库。在python中我有一个列表:
ID_list= ['A', 'C']
我想创建一个基本上与Mytable
内部加入ID_list
的查询,然后我可以进行WHERE
查询。
所以它基本上就是这样的
SELECT *
FROM Mytable
INNER JOIN ID_list
ON Mytable.ID = ID_list as temp_table
WHERE Value = 5
我没有数据库的写权限,因此需要在localy中创建表。或者有另一种方法吗?
答案 0 :(得分:2)
如果您有一张小桌子,那么您可以像Tim建议的那样创建并创建一个列表。
但是,我更喜欢使用python方式执行此操作。我也可能会将ID_list设为set
以避免重复等等。
in_list = '(%s)' % ','.join(str(id) for id in ID_list)
或者更好地使用绑定变量(取决于你正在使用的客户端,如果你正在处理一组整数,可能不是绝对必要的,因为我无法想象一种方法来注入sql):
in_list = '(%s)' % ','.join(['%d'] * len(ID_list)
并将您的ID_list作为cursor.execute
的参数列表发送。此方法是位置的,因此您需要正确排列绑定参数。
如果你有一个非常非常大的列表......你可以创建一个本地temp并在加入查询之前加载它。
CREATE LOCAL TEMP TABLE mytable ( id INTEGER );
COPY mytable FROM STDIN;
-- Or however you need to load the data. Using python, you'll probably need to stream in a list using `cursor.copy`
然后加入mytable。
我不会用很少的行来做后者,太多的开销。
答案 1 :(得分:0)
所以我使用了Tim的方法:
# create a String of all the ID_list so they can be inserted into a SQL query
Sql_string='(';
for ss in ID_list:
Sql_string= Sql_string + " " + str(ss) + ","
Sql_string=Sql_string[:-1] + ")"
"SELECT * FROM
(SELECT * FROM Mytable WHERE ID IN " + Sql_string) as temp
Where Value = 5"
工作得非常快