【问题标题】:Is there a conditional where statement in SQLite?SQLite 中是否有条件 where 语句?
【发布时间】:2019-05-26 02:55:09
【问题描述】:

我有一个带有待办事项数据库的待办事项应用程序。它包含一列done,该列将设置为false 或true。现在我想按 allunfinished 过滤数据。所以要么完成是无关紧要的,要么它必须是false

我在 TypeScript 应用程序中使用 SQLite3。目前我通过使用字符串模板来做到这一点,但我更喜欢基于 SQL 的解决方案。

db.prepare(`
  select 
    rowid as id, 
    title, 
    description
  from todo
    ${selectAll ? '' : 'where done = 0'}
    limit ?
    offset ?
`).all(limit, offset);

我的想法是使用 CASE 子句,但似乎无法绕过 WHERE 子句。

有没有更好的解决方案?

selectAll 是一个 TypeScript 变量,根据应用的查询参数设置。

selectAll 为假时的输出

id | title             | description          | done
1  | Clean the kitchen | as the title says... | 1
2  | Do the shopping   | potatoes, tomatoes   | 0
3  | Program stuff     | Todo app             | 1

selectAll 为真时的输出

id | title             | description          | done
2  | Do the shopping   | potatoes, tomatoes   | 0

【问题讨论】:

  • 你可以编辑添加你想要的输出吗?
  • @DanielE。当然。一分钟。
  • 为什么“更好”?对不同的查询使用不同的 SQL 有什么问题? (请注意,稍后您修改应用程序时会遇到更多查询。)
  • @CL。这是真的,是的。更好的是,我的意思是纯基于 sql 的解决方案,以防止任何攻击。我认为没有办法利用我上面的条件语句,但是当我稍后对其进行修改并继续为此使用条件语句时,它可能会影响应用程序的安全性。
  • 对于文本表示由用户控制的任何值,您需要参数 (?),但仅限于那些。

标签: sql typescript sqlite better-sqlite3


【解决方案1】:

你可以使用布尔逻辑:

where ? = '' or done = 0

【讨论】:

  • 这是一个不错的解决方案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
相关资源
最近更新 更多