Python SQLite WHERE语句,该语句为空
我有一张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) 但是,如果
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}"