【问题标题】:Ignore Where Clause if condition variable is null如果条件变量为空,则忽略 Where 子句
【发布时间】:2018-12-23 23:10:25
【问题描述】:

我在我的 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')""")

【问题讨论】:

  • ignore 是什么意思?在结果中包含它,还是在结果中排除它?顺便说一句,您没有使用 ORM 的原因是什么?
  • @WillemVanOnsem 我的意思是从查询中排除
  • 但是你的意思是如果(所以这里'aaa'None)?
  • @WillemVanOnsem 假设它可以不是“aaaa”。我想要写下一个查询,如果 param1 为 None,则从 where 子句中排除,如果它是 'aaaa',则包含在查询中
  • @WillemVanOnsem 我没有使用 ORM bcz 我使用的是外部数据库,我的 django 数据库是 sqlite3,我正在从 mysql 数据库获取数据

标签: html mysql django


【解决方案1】:

MySQL 查询中

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

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

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

因此,我们重复该值两次,如果参数为NULL,则条件的第一部分始终为TRUE,因此不应用过滤。如果参数不是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。

【讨论】:

    【解决方案2】:

    我认为你的意思是:

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

    【讨论】:

    • param is null 不等于ignore 它,它们有区别
    • 如果param1NULL,那么检查成立,所以无论param1 是否是'aaa',它都会被包含(因此不会被删除),否则我们需要检查param1 是否为'aaaa'。如果忽略意味着删除,OR 需要替换为AND(这基本上是您在回答中所做的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 2012-07-16
    • 2014-03-08
    • 1970-01-01
    • 2021-09-30
    • 2011-07-29
    • 1970-01-01
    相关资源
    最近更新 更多