我正在使用 Python Flask 和 MySQL。我从应用程序中获取名称、价格和数量的输入,以便从 MySQL 中搜索所有数据。
输出如下:
name | Price | Volume
Screw | 5.0 | 700
iron | null | 67
wood | 23 | null
metal | 76 | 56
plywood| 100 | null
rebar | 75 | 59
steel | null | 87
L steel| 78 | 65
我需要的是,当我选择特定的交易量范围时,我想排除交易量的空值,但包括价格的空值,反之亦然。
场景 1:
选择 60 到 100 之间的交易量,选择所有形式的价格和任何名称。
当前输出为:
name | Price | Volume
iron | null | 67
wood | 23 | null
plywood| 100 | null
steel | null | 87
L steel| 78 | 65
我需要的输出:
name | Price | Volume
iron | null | 67
steel | null | 87
L steel| 78 | 65
场景 2:
选择 50 到 120 之间的价格,选择所有形式的交易量和任何名称。
当前输出:
name | Price | Volume
iron | null | 67
metal | 76 | 56
plywood| 100 | null
rebar | 75 | 59
steel | null | 87
L steel| 78 | 65
我需要的输出:
name | Price | Volume
metal | 76 | 56
plywood| 100 | null
rebar | 75 | 59
L steel| 78 | 65
下面是我的代码:
@app.route('/ABC/search1', methods=['GET'])
def ABCsearch1():
name = request.args.get('name',default='',type=str)
priceMin = request.args.get('priceMin',default='',type=str)
priceMax = request.args.get('priceMax',default='',type=str)
volMin = request.args.get('volMin',default='',type=str)
volMax = request.args.get('volMax',default='',type=str)
limit = request.args.get('limit',default=0,type=int)
offSet = request.args.get('offSet',default=0,type=int)
query = """ SELECT * FROM KLSE WHERE (Stock LIKE :s0 or Name LIKE :s1 or Number LIKE :s2)
AND (Price BETWEEN (IF(:s3='_',-5000,:s4)) AND (IF(:s5='_',5000,:s6)) OR Price IS NULL)
AND (Volume BETWEEN (IF(:s7='_',-5000,:s8)) AND (IF(:s9='_',5000,:s10)) OR Volume IS NULL)
LIMIT :s95 OFFSET :s96 """
query = text(query)
input = {'s0':name+"%",'s1':name+"%",'s2':name+"%",'s3':priceMin,'s4':priceMin,'s5':priceMax,'s6':priceMax,'s7':volMin,'s8':volMin,'s9':volMax,'s10':volMax,
's95':limit,'s96':offSet}
try:
call = db.session.execute(query,input)
f = call.fetchall()
col = ['index','Name','Number','Price','id']
f1 = [OrderedDict(zip(col,t)) for t in f]
except Exception:
return 'Error'
return jsonify({'Stock': f1})
最佳答案
好的,如果我没理解错的话,您似乎想根据用户指定的是价格范围还是数量范围发送不同的请求。
在这种情况下,最简单的解决方案是使用 if-else 语句检查指定的范围,并适当修改查询字符串。
例如,
if (priceMin is None) and (priceMax is None):
# (Or whatever you want to compare it to)
query = """blah blah"""
input = blah blah
else if (volMin is None) and (volMax is None):
query = """blah blah"""
input = blah blah
# execute query...
如果这有帮助,请告诉我。顺便说一句,我强烈建议您使用 SQLAlchemy 而不是像您所做的那样创建 SQL 查询字符串。方便多了!您应该在这里查看教程:http://docs.sqlalchemy.org/en/rel_1_1/intro.html#documentation-overview
关于Python:MySQL 选择具有非空数据的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43849466/