如何使用用户输入和通配符编写 sql 查询

Posted

技术标签:

【中文标题】如何使用用户输入和通配符编写 sql 查询【英文标题】:How do i write a sql query with user input and wildcards 【发布时间】:2011-01-30 13:56:58 【问题描述】:

通常我将 where 语句写为 WHERE key=@0 然后添加一个参数。现在我希望用户指定几个字母,例如“燕麦”,并希望在其周围加上通配符%oat%,以匹配“涂层”。那么我该如何编写查询,以便通配符围绕用户输入('seachword')。

现在让我们更进一步。我不希望用户写 % 所以他不能做 blah%ing。也许 % 是句子的一部分(或者它可能是非法的,但我更喜欢它是句子的一部分)。如何将通配符放在单词或句子周围,并禁止用户将通配符放在单词之间? (并且最好使 % 成为句子的一部分)

C# ado.net sql/sqlite

【问题讨论】:

【参考方案1】:

如果您使用 prepared statements(即 SQLiteCommand,DbCommand 的子类),这将为您处理。例如:

using (SqlCommand myCommand = new SQLiteCommand("SELECT * FROM TABLE WHERE (COLUMN LIKE = '%' + @input + '%')"))

        myCommand.Parameters.AddWithValue("@input", input);
        // ...

另见类似previous question。

【讨论】:

【参考方案2】:

RE:我如何将通配符放在单词或句子周围,并禁止用户将通配符放在单词之间? (并且最好使 % 成为句子的一部分)

我认为您需要将用户提供的任何% 替换为\% 并使用

LIKE @Expression ESCAPE '\'

【讨论】:

【参考方案3】:

继续使用参数,但在绑定之前在参数中添加通配符。

C#:

  param = '%' + Regex.Replace(param, @"[%?]", String.Empty) + '%'

SQL:

select * from ... where key like :param

【讨论】:

以上是关于如何使用用户输入和通配符编写 sql 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL 函数和用户提供的输入创建自定义 Diesel 查询?

SQL 怎么实现模糊查询?

MySQL使用查看表SELECT语句

使用LIKE子句正确格式化sql查询

SQL 注入中的“参数化查询/准备语句”如何比转义用户输入更好

清理用户输入