Выбор всех строк, которые соответствуют частям строки - PullRequest
0 голосов
/ 02 октября 2018

У меня есть таблица людей

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

И у меня есть список имен в string , разделенных запятыми , который выглядит следующим образом:

"Mark, Bob, John"

Мне нужна команда SQL , которая бы выбирала все строки, которые соответствуют именам в списке.

Любая идея, как это сделать?

Он находится в c # на wpf, а база данных - PostgreSQL , если это имеет значение.

Ответы [ 4 ]

0 голосов
/ 02 октября 2018

В общем случае вы можете попробовать построить параметризованный запрос:

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()) {
      ...
    }
  }
}
0 голосов
/ 02 октября 2018

создайте специальный запрос из вашей строки имени, такой как:

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})";
0 голосов
/ 02 октября 2018

Сначала вы должны разобрать строку с C #.Есть много разных способов сделать цикл, но после подстановки имен поместите их в массив, список или что-то еще.В цикле ищите имена, используя предложение LIKE.

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

Не уверен, как вы строите свой SQL, но если вы используете строку, это будет выглядеть примерно так.Вы можете убрать LIKE, если вы ищете только прямые матчи.Лучше поместить все значения либо в нижний, либо в верхний регистр, чтобы убедиться, что вы получаете их, ЕСЛИ вы не знаете, УВЕРЕН, что вы хотите, чтобы Марка не отмечалась, или МАРКА, и т. Д. Я не знаю C #, поэтому я уверен, что есть гораздо лучший способ, сдобавление частей массива вместе с запятыми и тому подобное для использования оператора IN.

0 голосов
/ 02 октября 2018

Мне нужна команда SQL, которая бы выбирала все строки, соответствующие именам в списке.

Как насчет IN?

SELECT * FROM People WHERE Name IN ('Mark', 'Bob', 'John')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...