Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLite WHERE语句,该语句为空_Python_Sqlite - Fatal编程技术网

Python SQLite WHERE语句,该语句为空

Python SQLite WHERE语句,该语句为空,python,sqlite,Python,Sqlite,我有一张SQLite的桌子。正如预期的那样,我可以使用WHERE变量访问它 import sqlite3 name = 'john' age = 16 conn = sqlite3.connect('AmApp.db') sql = """SELECT * FROM clients WHERE first_name='{}' AND age={}""".format(name, age) df = pd.read_sql_query(sql, conn) print (df) 但是,如果

我有一张SQLite的桌子。正如预期的那样,我可以使用WHERE变量访问它

import sqlite3

name = 'john'
age = 16

conn = sqlite3.connect('AmApp.db')
sql = """SELECT * FROM clients WHERE first_name='{}' AND age={}""".format(name, age)

df = pd.read_sql_query(sql, conn)
print (df)

但是,如果名称或年龄为空,则这不起作用。虽然可以手动解决这个问题,但我的意图是年龄和姓名是用户输入。因此,我该如何设置它,使WHERE语句不进行筛选?一种方法是引入两个新参数,分别对应于
名称
年龄
,表示是否对该列进行筛选,与运算符
或带有相应列的
组合:

sql = """SELECT * FROM clients WHERE (first_name='{}' OR 0={}) AND (age={} OR 0={})""".format(name, filterbyname, age, filterbyage) 
这些新参数将具有值
0
1

示例:
name
age
的值1和有效值:

filterbyname = 1
name = 'john'
filterbyage = 1
age = 16
filterbyname = 0
name = ''
filterbyage = 1
age = 25
对于
filterbyname
1
name
的有效值,对于
filterbyage
0
any年龄
的值(仅按名称过滤):

对于
filterbyage
1
age
的有效值,对于
filterbyname
0
任何
name
的值(仅按
age
过滤):

如果要返回表中的所有行而不进行筛选:

filterbyname = 0
name = ''
filterbyage = 0
age = 0

创建动态sql查询的标准方法是
case
语句,尽管查询变得有点难以阅读:

import pandas as pd
import sqlite3

conn = sqlite3.connect("DataSource=:memory:;Version=3;New=True;")
create_table=""" CREATE TABLE IF NOT EXISTS clients (
                                        id integer PRIMARY KEY,
                                        first_name text NOT NULL,
                                        age integer
                                    )"""
c = conn.cursor()
c.execute(create_table)
c.execute("insert into clients(id,first_name,age) values(1,'john',16)")
c.execute("insert into clients(id,first_name,age) values(2,'tom',20)")
c.execute("insert into clients(id,first_name,age) values(3,'tom',16)")

name = 'john'
age = 16

sql = f"""SELECT * FROM clients WHERE 
          case when '{name}' = '' then 1 else first_name end = case when '{name}' = '' then 1 else '{name}' end AND
          case when {age} = 0 then 1 else age end = case when {age} = 0 then 1 else {age} end"""


df = pd.read_sql_query(sql, conn)
print(df)
示例:

name = 'john'
age = 16

   id first_name  age
0   1       john   16




尽管您说过不希望手动解决此问题,但根据选择参数手动生成查询字符串可能更容易:

sql = "SELECT * FROM clients WHERE 1"
if name != '':
    sql += f" AND first_name='{name}'"
if age > 0:
    sql += f" AND age={age}"
name = ''
age = 16

   id first_name  age
0   1       john   16
1   3        tom   16
name = 'tom'
age = 0

   id first_name  age
0   2        tom   20
1   3        tom   16
name = ''
age = 0

   id first_name  age
0   1       john   16
1   2        tom   20
2   3        tom   16
sql = "SELECT * FROM clients WHERE 1"
if name != '':
    sql += f" AND first_name='{name}'"
if age > 0:
    sql += f" AND age={age}"