извлекать и заменять параметры в SQL-запросе, используя M-язык - PullRequest
0 голосов
/ 31 января 2019

Этот вопрос связан с этим вопросом .Однако в этом вопросе я сделал несколько неправильных предположений ...

У меня есть строка, содержащая запрос SQL, с одним или несколькими параметрами или без них, где каждый параметр имеет знак "&" (знак амперсанда) какпрефикс.Теперь я хочу извлечь все параметры, загрузить их в таблицу в Excel, где пользователь может ввести значения для каждого параметра.Затем мне нужно использовать эти значения в качестве замены переменных в запросе SQL, чтобы я мог выполнить запрос ...

Проблема, с которой я сталкиваюсь, заключается в том, что извлечение (и, следовательно, также замена) имен параметровне все так просто, потому что параметры не всегда заключены в пробелы (как я предполагал в моем предыдущем вопросе)

См. следующие примеры

Select * from TableA where ID=&id;

Select * from TableA where (ID<&ID1 and ID>=&ID2);

Select * from TableA where ID = &id ;

Итак, две части моего вопроса:

  1. Как извлечь все параметры
  2. Как заменить все параметры, используя другую таблицу, в которой определены замены (см. Также мой предыдущий вопрос )

1 Ответ

0 голосов
/ 01 февраля 2019

Полное решение для этого потребовало бы углубления в детали того, как структурированы ваши данные, и потенциально могло бы охватывать множество тем.Поскольку вы уже рассмотрели один способ массового поиска / замены (который можно выполнить различными способами в Power Query), я просто покажу вам свое уродливое решение для извлечения параметров.

List.Transform
(
  List.Select
  (
   Text.Split([YOUR TEXT HERE], " "), each Text.Contains(_,"&")
  ), 
  each List.Accumulate
      (
       {";",")"}, <--- LIST OF CHARACTERS TO CLEAN
       "&" & Text.AfterDelimiter(_, "&"),
       (String,Remove) => Text.Replace(String,Remove,"")
      ) 
)

Это немного запутанно, но вот лучшее, что я могу объяснить, что происходит.

Первая ключевая часть объединяет List.Select с Text.Split для извлечения всех параметров из строки в список.Он использует «» для разделения слов в списке, а затем фильтрует слова, содержащие «&», что во втором примере означает, что список будет содержать «(ID <& ID1» и «ID> = & ID2);»на данный момент.

Вторая часть использует Text.AfterDelimiter для извлечения текста, который появляется после «&» в нашем списке параметров, и List.Accumulate для «очистки» любых нежелательных символов, которые потенциально могут бытьдержась за параметр.Список символов, которые вы хотите очистить, должен быть определен вручную (я просто вставляю «;» и «)» на основе данных примера).Мы также вручную повторно добавляем «&» к параметру, потому что Text.AfterDelimiter удалил бы его.

В результате получается объект List из извлеченных параметров из любой предоставленной вами примерной строки.Вы можете настроить запрос, который будет принимать таблицу из ваших строк SQL, применять этот код в настраиваемом столбце, где [ВАШ ТЕКСТ ЗДЕСЬ] - это поле, содержащее ваши строки, а затем расширять получаемые списки и удалять дубликаты на них, чтобы получить уникальный список.всех параметров в ваших строках SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...