选择与字符串部分匹配的所有行

时间:2018-10-02 12:36:13

标签: c# sql postgresql

我有一张桌子

Id | Name | Info
1  | Bob  | some info
2  | Mark | some info

string中,我有一个名称列表,以逗号分隔,如下所示:

"Mark, Bob, John"

我需要一个 SQL命令,它将选择列表中与名称匹配的所有行。

有什么想法吗?

它在wpf上的 c#中,如果重要的话,数据库为 PostgreSQL

4 个答案:

答案 0 :(得分:2)

根据您的姓名字符串创建即席查询,例如:

string Names = "Mark, Bob, John";

//Step 1: add quotes to Names 
var names = Names.Split(',').Select(x => $"'{x}'").ToList();

//Step 2: Join Quoted Names
var result = String.Join(",", names.ToArray());

//Step 3 Create Ad hoc query
string query = $"SELECT * FROM people WHERE NAME IN ({result})";

答案 1 :(得分:2)

一般情况下,您可以尝试构建参数化查询:

string names = "Mark, Bob, John";

string[] filters = names
  .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
  .Select(name => name.Trim())
  .Where(name => !string.IsNullOrEmpty(name))
  .ToArray();

//TODO: Put the right class instead of SqlConnection
using (var connection = new SqlConnection("ConnectionStringHere")) {
  connection.Open();

  using (var command = connection.CreateCommand()) {
    command.Connection = connection;

    command.CommandText =
      $@"select *
           from MyTable
          where Name in ({string.Join(", ", filters.Select((name, i) => $"@prm_Name{i}"))})";

    //TODO: Change AddWithValue into Add and provide the RDBMS type
    for (int i = 0; i < filters.Length; ++i)
      command.Parameters.AddWithValue($"@prm_Name{i}", filters[i]);

    using (var reader = command.ExecuteReader()) {
      ...
    }
  }
}

答案 2 :(得分:1)

  

我需要一个SQL命令,该命令将选择与列表中的名称匹配的所有行。

IN怎么样?

SELECT * FROM People WHERE Name IN ('Mark', 'Bob', 'John')

答案 3 :(得分:0)

您应该先将字符串与C#分开。循环有很多不同的方法,但是在将名称子字符串化之后,将它们放置在数组或列表等中。在循环中,使用LIKE子句查找名称。

'SELECT *
  FROM myTable
    WHERE LOWER(nameField) LIKE LOWER(%' + variable + '%)';

不确定如何构建SQL,但是如果您使用字符串,它将看起来像这样。如果您只寻找直接匹配项,则可以参加LIKE。最好将所有值都以小写或大写形式放置,以确保获得它们,除非您确定要不要Mark或MARK等。我不知道C#,所以我相信有一种更好的方法将数组的各个部分与逗号等一起使用IN运算符。