使用变量以及某些情况下的值(带有联接)创建动态SQL查询

时间:2018-09-01 16:17:26

标签: python string python-3.x

我需要创建一个动态SQL查询,该查询根据不同的参数/变量的存在和值而变化:

所以,我有这样的东西:

def create_query(用户=无,最大=无,列表=无)

qs = 'SELECT N.status'

if user: 
    qs = qs.join('U.email')

qs = join('from notes as N)'

if user: 
  qs = 'LEFT JOIN users AS U on N.user_id=U.id'

if max:
  qs = qs.join('where max=') + max

if list:

  qs = qs.join('where fame_values in list')

....

我大约有20个变量可以更改查询,因此我正在寻找更多的pythonic(例如带条件的列表推导),但是要查找字符串

2 个答案:

答案 0 :(得分:1)

您可以创建一个函数,该函数根据传递给它的参数创建查询。
考虑以下示例:

def create_query(user, max_value = None):
    query = 'SELECT N.status'+ (' U.email' if user else ' ') + ' from notes as N' + (' LEFT JOIN users AS U on N.user_id=U.id' if user else ' ') + (' where max={}'.format(max_value) if max_value else " ") 
    return query

query = create_query(user=True,max_value=10)
# SELECT N.status U.email from notes as N LEFT JOIN users AS U on N.user_id=U.id where max=10
query = create_query(user=False)
# SELECT N.status  from notes as N 
query = create_query(user=True)
# SELECT N.status U.email from notes as N LEFT JOIN users AS U on N.user_id=U.id 

答案 1 :(得分:0)

如果您正在使用python,我建议构建查询 在您的代码中,并使用cx_Oracle连接到数据库 (或其他模块,如果您有其他数据库)

如果您真的想用纯sql来做, 您需要做的是对所有内容进行主连接, 并用例显示所需的数据。

case when x then y
when b then c
else null end case1,
case2 when x then t
when g then c
else null end case2
from a join b join c join...

一些您确实想做的例子会有所帮助。