【问题标题】:Is there a way to do conditional select statements in SQLite?有没有办法在 SQLite 中执行条件选择语句?
【发布时间】:2021-06-15 19:48:28
【问题描述】:

我正在尝试创建一个应用程序,在该应用程序中,用户可以选择通过在两个输入框之一中输入信息来查询数据库。我希望能够使用单个 select 语句并根据用户输入信息的框有条件地查询数据库。我目前正在尝试使用 CASE 子句,但我相信当我尝试在 THEN 参数中包含 WHERE 子句时它会遇到错误。这是我目前正在使用的:

    conn = sqlite3.connect('database.db')

    c = conn.cursor()

    c.execute("""
        SELECT CASE 
            WHEN :var1 <> '' THEN * WHERE column1 = :var1
            ELSE * WHERE column2 LIKE '%'||var2||'%' 
        FROM table_name
        """,
        
        {
            'var1': entrybox1.get(),
            'var2': entrybox2.get()
        })

当我通过我的编译器运行它时,我在 THEN 行中 WHERE 子句开始的位置出现语法错误。字典键代表我获得用户输入的不同文本字段。任何关于我可以在这里做些什么来解决这个问题或更有效的方法来解决我试图回答的问题的任何建议都将不胜感激。谢谢!

【问题讨论】:

  • 用 Python 切换就行了……!? if entrybox1.get(): c.execute('SELECT * WHERE ...') else: ...

标签: python sql sqlite


【解决方案1】:

CASE 表达式移至WHERE 子句:

SELECT *
FROM table_name
WHERE CASE 
  WHEN :var1 <> '' THEN column1 = :var1
  ELSE column2 LIKE '%' || :var2 || '%' 
END

CASE 表达式的结果是一个布尔值,如column1 = :var1column2 LIKE '%' || :var2 || '%',因此适用于 WHERE 子句。

【讨论】:

  • 只是好奇,是否允许使用返回比较的case when?我以前从未见过......据我所知,case when 执行比较并返回一个值,而不是另一个比较,但也许在 sqlite/python 中它是不同的......
  • @JaimeDrq CASE 表达式返回 1 个值。如果此值为 column1 = :var1,则为布尔值 0 或 1。
  • 你能在 dbfiddle 中举个例子吗?我很好奇如何编写该查询,但我完全相信你!
  • @JaimeDrq 不,目前我不能。如果您愿意,可以使用自己的示例数据进行尝试。
  • @forpas,确实我做到了,而且它只在 sqlite 中工作,而不是在 sql server 中,也不在 Oracle 中......这就是为什么我以前没有见过它(我从来没有工作过用sqlite)。但是谢谢,每天都能学到新东西是件好事,我赞成你的回答。
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 2022-01-24
  • 1970-01-01
  • 2019-06-21
相关资源
最近更新 更多