Как я могу перевести ms-access NZ в функции IFNULL MySQL или MariaDB? - PullRequest
2 голосов
/ 24 апреля 2020

Я пишу "переводчик" запросов SQL из ms-доступа к MySQL или MariaDB SQL на основе регулярного выражения с sed.

Моя проблема заключается в функции nz, которая имеет два формы:

     access          MariaDB or MySQL
nz(expr1,expr2) --> ifnull(expr1,expr2)
nz(expr)        --> ifnull(expr,0)

У меня есть две эти стадии для каждого случая, но не только одна для обеих:

sed -E 's/nz\((.*),(.*)\)/ifnull\(\1,\2\)/gi'
sed -E 's/nz\((.*)\)/ifnull\(\1,0\)/gi'

Ты знаешь, как объединить обе только в одну стадию sed? Или, может быть, использовать другой инструмент как tr, awk или perl?

ОБНОВЛЕНИЕ

Для этого ввода:

SELECT nz(column1),nz(column2,4),column3 FROM table;

Требуемый вывод это:

SELECT ifnull(column1,0),ifnull(column2,4),column3 FROM table;

1 Ответ

1 голос
/ 25 апреля 2020

Один из вариантов - использовать шаблон с 2 группами захвата, где вторая группа является необязательной. Затем вы можете выполнить условную замену, используя perl, используя , определенное .

Шаблон

nz\(([^,()]+)(,[^,()]+)?\)

Объяснение

  • nz\( Совпадение nz(
  • ( Захват группа 1
  • ) Закрыть группу 1
  • ( Захват группа 2
    • ,[^,()]+ Совпадение , и совпадение 1+ раз с любым символом, кроме , ( )
  • )? Закрыть группу 2 и сделайте ее необязательной
  • \) Match )

Regex demo | Perl демо

Пример кода

my $str = "SELECT nz(1), nz(2,3), column FROM table;";
$str =~ s/nz\(([^,()]+)(,[^,()]+)?\)/defined($2) ? "ifnull(" . $1.$2 . ")":"ifnull(" . $1 . ", 0)"/ge;
print $str
  • s/// используется для замены
  • /e является модификатором оценки
  • /g является глобальным модификатором

Выход

SELECT ifnull(1, 0), ifnull(2,3), column FROM table;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...