簡體   English   中英

如何在不重寫多個 SQL 語句的情況下查詢(SQL)可變數量的用戶輸入

[英]How to query (SQL) a variable amount of user input without rewriting multiple SQL statements

我正在創建一個 web 應用程序(使用 Flask),其中用戶可以 select 和輸入變量,然后根據所選變量從數據集中生成 output。 這些可能的變量可以在下面的 HTML POST 表單中看到,並被饋送到后端以允許在其他代碼塊中看到 SQL 查詢。

我遇到的問題是,當用戶選擇一些輸入變量但將其他變量留空時,查詢會返回所有數據。

例如,如果從表單的下拉列表之一中選擇了值“金融犯罪”,但沒有填寫其他下拉列表/文本輸入,則查詢將返回所有可能的結果。 而我想要的結果是查詢返回 Category=Financial Crime 的所有行。

我知道我可以編寫一個if語句來排除任何值為''輸入變量,但這需要為每個可能的結果重新編寫查詢,我確信必須有一條路線以更簡單、更優化的方式執行此操作.

HTML:

<form method="POST">

                <div class="row">
                    <div class="col">
                        <p>Enter Company/Product name:</p>
                        <input type="text" name="name" class="form-control">
                    </div>

                    <br><br>

                    <div class="col">
                        <p>Enter Keywords (delimited by comma):</p>
                        <input type="text" name="keywords" class="form-control">
                    </div>

                </div>

                <br>

                <div class="row">
                    <div class="col-sm text-left">
                        <label for="category">Choose a category: </label>
                    <br>
                        <select name="category" id="category">
                            <option value="">Select Category</option>
                            <option value="Financial Crime">Financial Crime</option>
                            <option value="Regulatory Change">Regulatory Change</option>
                        </select>
                    </div>

                    <div class="col-sm text-center">
                        <label for="maturity">Choose maturity: </label>
                    <br>
                        <select name="maturity" id="maturity">
                            <option value="">Select Maturity</option>
                            <option value="Incumbent">Incumbent</option>
                            <option value="Challenger">Challenger</option>
                            <option value="New kid">New kid</option>
                        </select>
                    </div>

                    <div class="col-sm text-right">
                        <label for="under_tech">Choose underlying tech: </label>
                            <br>
                            <select name="under_tech" id="under_tech">
                                <option value="">Select Underlying Tech</option>
                                <option value="AI/ML">AI/ML</option>
                                <option value="Cloud">Cloud</option>
                                <option value="Blockchain">Blockchain</option>
                            </select>
                    </div>
                </div>

                <br><br>
                <div class="row float-right">
                    <input class="btn btn-primary" type="submit" value="Search">
                </div>
            </form>

Python(燒瓶)/SQL:

@app.route('/advancedsearch', methods=['GET', 'POST'])
def advancedsearch():
    if request.method == 'POST':
        category = request.form.get('category')
        maturity = request.form.get('maturity')
        under_tech = request.form.get('under_tech')
        keywords = request.form.get('keywords')
        name = request.form.get('name')
        attribs = [name,keywords,category,maturity,under_tech]

        with db.connect() as conn:
            # Query to find products with selected attributes
            qry = """SELECT CompanyName,ProductName,Category,CompanyWebsite,Logo
                    FROM directory_data.full_dataset
                    WHERE Company_description LIKE %s
                    AND Underlying_Tech LIKE %s
                    AND Company_Maturity LIKE %s
                    AND Category LIKE %s
                    AND CompanyName LIKE %s OR ProductName LIKE %s"""
            results = conn.execute(qry, ("%"+attribs[1]+"%","%"+attribs[4]+"%","%"+attribs[3]+"%","%"+attribs[2]+"%","%"+attribs[0]+"%","%"+attribs[0]+"%")).fetchall()

        if results:
            return render_template('advancedsearch.html', results=results, attribs=attribs)
        else:
            error = 'Results not found'
            return render_template('advancedsearch.html', error=error, attribs=attribs)
    return render_template('advancedsearch.html')

在您看來,將通配符%指定為任何缺少或為空的變量的默認值:

category = request.form.get('category') or '%'
maturity = request.form.get('maturity') or '%'
etc.

此外,這變得不必要:

"%"+attribs[1]+"%"

您可以只使用attribs[1] ,因為LIKE已經進行了 substring 匹配。 CompanyName LIKE appleCompanyName LIKE %apple%完全相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM