我有一张桌子
Id | Name | Info
1 | Bob | some info
2 | Mark | some info
在string
中,我有一个名称列表,以逗号分隔,如下所示:
"Mark, Bob, John"
我需要一个 SQL命令,它将选择列表中与名称匹配的所有行。
有什么想法吗?
它在wpf上的 c#中,如果重要的话,数据库为 PostgreSQL 。
答案 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)
答案 3 :(得分:0)
您应该先将字符串与C#分开。循环有很多不同的方法,但是在将名称子字符串化之后,将它们放置在数组或列表等中。在循环中,使用LIKE子句查找名称。
'SELECT *
FROM myTable
WHERE LOWER(nameField) LIKE LOWER(%' + variable + '%)';
不确定如何构建SQL,但是如果您使用字符串,它将看起来像这样。如果您只寻找直接匹配项,则可以参加LIKE。最好将所有值都以小写或大写形式放置,以确保获得它们,除非您确定要不要Mark或MARK等。我不知道C#,所以我相信有一种更好的方法将数组的各个部分与逗号等一起使用IN
运算符。