如果条件变量为空,则忽略条款

时间:2018-07-16 11:52:24

标签: html mysql django

我在Django代码中使用了html的输出,如果它为null,我希望mysql查询忽略where子句,并且如果它有值,请在查询中使用。

以下是我的html:

 <form method="post" novalidate>
      {% csrf_token %}
     <input type="text" name="param1" placeholder="param1">
     <input type="text" name="param2" placeholder="param">
     <input type="text" name="param3" placeholder="param3">
     <input type="submit" name="fetchdata" value="Fetch Data">
     <br>
    </form>

在MySQL中如何实现:

def current_cfg(request):
    if request.POST.get("fetchdata"):
        param1=request.POST["param1"]
        param2=request.POST["param2"]   <----aaaa from html as input
        param3=request.POST["param3"]
    else:
        RNC='RRRNCH02'
        MO='CORRMALGOSWITCH'
        parameterid='DRASWITCH_DRA_VOICE_SAVE_CE_SWITCH'

    conn=db.connect(host='localhost', user='update_db', passwd='1qaz!QAZ', db='rnc_parameters')c=conn.cursor()
    c=conn.cursor()
    c.execute("""select * from rnc_parameters.current_para where (if param1 is null ignore it else param1='aaaaa')""")
    current_stats=c.fetchall()
    conn.close()
    current_stats=list(current_stats)
    return render(request,'current.html',{'current_stats':current_stats, 'MO':MO})

您能帮助我正确定义以下部分吗?

    c.execute("""select * from rnc_parameters.current_para where (if param1 is null ignore it else param1='aaaaa')""")

2 个答案:

答案 0 :(得分:1)

MySQL查询中

根据评论,我认为变量param2本身可以是None,在这种情况下,您不想对此进行过滤。

我们可以通过以下查询来做到这一点:

SELECT *
FROM rnc_parameters.current_para
WHERE (%s IS NULL OR param1='%s')

因此,我们将值重复两次,并且如果参数为NULL,则条件的第一部分始终为TRUE,因此不应用任何过滤。如果参数为 not NULL,则第一部分为FALSE,因此条件取决于param1的值。

我们可以将它们链接在一起,例如:

SELECT *
FROM rnc_parameters.current_para
WHERE (%s IS NULL OR param1='%s')
  AND (%s IS NULL OR param2='%s')
  AND (%s IS NULL OR param3='%s')

带有参数[param1, param1, param2, param2, param3, param3]

构建查询时的处理方式

另一种方法是动态构造查询。例如:

cond = []
vars = []
if param1 is not None:
    cond.append("param1 = '%s'")
    vars.append(param1)
if param2 is not None:
    cond.append("param2 = '%s'")
    vars.append(param1)
if param3 is not None:
    cond.append("param3 = '%s'")
    vars.append(param1)
query = """SELECT * FROM rnc_parameters.current_para"""
if cond:
    query += " WHERE " + " AND ".join(cond)

,然后使用vars作为参数调用查询。

尽管如此,这两种方法都不雅致,我建议使用ORM。

答案 1 :(得分:0)

我认为你的意思是

WHERE (param1 is null OR param1='aaaaa')