【问题标题】:How can i find rows in DataTables according to row value如何根据行值在 DataTables 中查找行
【发布时间】:2012-08-01 10:46:57
【问题描述】:

我有一个 DataTable,其中可能有一列中的值看起来像 x:1 x:2 a:1 a:2 等...但它们也可能看起来像 x*a* .

在我的代码中,我得到了一个完整的值来搜索(例如x:1),但行本身可以在该列中包含一个类似x* 的值。 我可以以某种方式使用 Select 方法来搜索行吗?

现在看起来像这样:

strSelect = string.Format("[{0}]='{1}'", colName, ValueToSearch);
rows = tempTable.Select(strSelect);

但当然,我会得到的唯一行是那些看起来与表格中的一模一样的行。这意味着在搜索x:1 时,我不会得到x* 的行

【问题讨论】:

  • 您能否更清楚地了解您获得的值是什么样的,数据库中的值是什么样的,以及您期望能够检索到什么? “x*”和“x:1”看起来像是虚构的例子,并且稍微复杂一些,因为我不确定你的实际数据是什么样的。您能否举几个真实示例,说明您用于搜索的内容、数据库中的值以及您期望查询实际查找的内容?
  • @Chris 它们是虚构的示例,但它们看起来确实与实际值有点相似。实际值的示例可以是:“G:ch1 - 2412”,ch1 ch2 等有很多类似的含义,并且可能有类似的值,例如“A:ch ...”或 B 等. 现在,我有一个表格,有人可以在其中纠正一个特定的实际值,或者它也可以是“A:ch*”或“G*”,因为从外部价值作者认为“*”是“任何string",我正在寻找一种轻松识别它的方法

标签: c# select datatable row


【解决方案1】:

代码strSelect = string.Format("[{0}]='{1}'", colName, ValueToSearch); 将选择相同的值。如果要搜索子集,必须使用 LIKE 运算符:

strSelect = string.Format("[{0}] LIKE '{1}'", colName, ValueToSearch.Replace("*", "%");

【讨论】:

  • 用“%”替换“*”到底是做什么的?
  • 这也是不正确的,因为我写道我要搜索的值是一个完整的值,意思是“x:1”。表本身可能包含“x*”,但我收到的是要搜索的完整值
  • 如果您不指定“*”,则 LIKE 运算符的工作方式与“=”运算符相同。或者我误解了你的问题。
  • 在我的情况下,数据表可以包含像 x* 这样的值。我得到一个 x:1 的值,我想得到 x* 行。在您的回答中,您的回答就像我在寻找 x* 一样,但反过来
  • 那么,输入数据“x:1”的意思是“x:1”或“x*”?
【解决方案2】:

我暂时假设您的数据库包含 4 行,在您要查询的给定列中具有以下值:

  • x:1
  • x:2
  • x*
  • a:1
  • a:2
  • 一个*

您声明您收到了一个值,例如“x:1”,您需要在查询中使用该值,但您暗示查询最终应该返回前三个记录 - 值为“x:1”、“x:2”和“x*”。换句话说,虽然你得到的是'x:1',但你实际上想要搜索任何值以'x'开头的记录。

如果是这种情况,您最好在发出查询之前修改 C# 代码中的值。如果您的搜索值确实是“x:1”形式,您可以在将其交给 SQL 查询之前将最后两个字符去掉:

string searchValue = "x:1"; // this presumably actually comes from user input
searchValue = searchValue.Substring(0, searchValue.Length - 2);
// Now searchValue is just "x", so go ahead and create your SQL query using the 'LIKE' operator

我觉得这只是对您的实际数据的简化,这使得它难以精确,也使得提供包含错误检查的示例变得更加困难。

对于一个稍微复杂一点的例子,也许您的用户给您的搜索值可以是一串字母,也可以是一串字母,后跟冒号,后跟更多字母。在这种情况下,您需要检查给定的字符串是否包含冒号,如果包含,则需要将冒号及其后面的任何内容剪掉:

string searchValue = "abc:def";
if (searchValue.Contains(":"))
    searchValue = searchValue.Substring(0, searchValue.IndexOf(":"));
// Having stripped off ":def", you're left with "abc"

现在您可以继续使用 LIKE 运算符发出查询,正如 TcKs 在他的回答中已经显示的那样。例如,您可以将已有的查询代码修改如下:

strSelect = string.Format("[{0}] LIKE '{1}'", colName, ValueToSearch);
rows = tempTable.Select(strSelect);

通过使用 LIKE 运算符,您现在可以查找任何具有以“abc”开始的值的记录。

【讨论】:

  • 只是为了让它更清楚 - 我得到了一个我从某个地方读取的值,该值始终是完整的值,这意味着它始终采用“x:1”的形式。但是,表格本身可以有像“x*”这样的值,并且表格有更多的行,当你得到一个适合 x* 的 x:1 值时,需要根据表格中的另一列来做一些事情。此外,我可以知道一个事实,即表中的相同值不会在同一列中重复。这意味着我可以在同一列中有 x:1 或 x:2 但不能有 x:1 和 x*
  • 我认为您误解了我在问题中提出的问题。数据表确实包含您从一开始就编写的值,但要搜索的值本身将始终以其完整形式表示,例如 x:1,这意味着我不能使用 LIKE 运算符,因为 x:1不是 LIKE x* 而是相反。我想获取可能存在 x* 的行,其中要搜索的值为 x:1
  • 这就是为什么我说你需要砍掉“结束”部分。根本不要搜索 x:1,去掉 :1 并对 x 进行基于 LIKE 的查询。没有神奇的方法可以将 x:1 作为搜索参数的查询交给 SQL 并让它知道您也希望返回 x*。如果您只想根据字符串的前“一半”进行搜索,则只需这样做 - 获取您感兴趣的一半并将其用作参数。
  • 你知道一种方法来检查表中的值是否包含字符串“”吗?我不知道如何使用条件制作 sql 语句,这意味着如果列中没有“”并且我想将要搜索的值的整个字符串与列中的值进行比较,我想如果确实有那个字符串,则砍掉“*”之前的任何内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
相关资源
最近更新 更多