【问题标题】:Checking for multiple substrings in an SQL query检查 SQL 查询中的多个子字符串
【发布时间】:2012-07-27 23:09:18
【问题描述】:

我有一列包含许多行。我正在将值列表传递给方法。我希望返回该列的子字符串包含我要查找的值的所有行。

目前,我使用CHARINDEX 来检查单个子字符串,并为每个后续子字符串附加OR CHARINDEX。这很混乱,我相信你会欣赏的。

所以,目前,我有:

[Long SQL query]...
queryString.Append(string.Format(" (AND CHARINDEX( '{0}', Table.Column ) > 0 ", ListOfValues[0]));
            foreach (string value in ListOfValues)
            {
                queryString.Append(string.Format("OR CHARINDEX( '{0}', Table.Column ) > 0 ", value));
            }

            queryString.Append(string.Format(")AND CHARINDEX( '{0}', Table.Column) > 0)"));

queryString.Append(")");

有没有更不可怕的语法方式来做到这一点? :)

谢谢

【问题讨论】:

  • 你最后的 Append 是什么意思?它似乎使用占位符调用 Format 但没有参数,我无法弄清楚它应该做什么......
  • 您应该能够更新您的帖子以更正违规代码。

标签: c# sql sql-server select


【解决方案1】:

如果我理解这个问题,那么您可以更轻松地在 SQL 端执行此操作。

Select MyColumn
From MyTable
Where MyColumn Like '%MySubstringText%'

如果您的子字符串要更改,显然您需要动态创建 SQL 语句。

编辑:

如果您有多个可能的子字符串,那么您可以使用值列表填充一个表,然后交叉连接两个表并使用 CharIndex 进行过滤。

Create table MySubstrings
(
    MySubstring nvarchar(100) not null
)


Select t.MyColumn
From MyTable t, MySubstrings s
Where CharIndex(s.MySubstring, t.MyColumn) > 0

虽然性能可能不是很好。

【讨论】:

  • Like 在语法上可能没有charindex 可怕,但你仍然需要循环和一长串this or this or this...
  • 我已经编辑了答案以处理多个值的可能性。
【解决方案2】:

首先,将字符串放入这样的 SQL 查询中是非常危险的!如果您不小心,您将打开您的应用程序以进行 SQL 注入 http://en.wikipedia.org/wiki/SQL_injection

现在来回答:

queryString.Append(string.Format(" Table.Column LIKE '%{0}%' ", ListOfValues[0]));

为避免 SQL 注入,请尝试这样做:

command.Parameters.AddWithValue("@ParamX","%" + value + "%");

当我们在这里进行字符串比较时,我想不出用 SQL 服务器来处理它的更简单的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多