【发布时间】:2019-05-26 02:55:09
【问题描述】:
我有一个带有待办事项数据库的待办事项应用程序。它包含一列done,该列将设置为false 或true。现在我想按 all 或 unfinished 过滤数据。所以要么完成是无关紧要的,要么它必须是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