2012-05-30 4 views
2

У меня есть что-то вроде этого:Postgresql запрос из консоли

UPDATE table SET column=REGEXP_REPLACE(column, E'\[(.*)\]$', ''); 

Все в порядке с этим запросом, но существует проблема, когда я хочу сделать это из консоли, как здесь:

psql -U postgres db -c "UPDATE table SET column=REGEXP_REPLACE(column, E'\\[(.*)\\]$', '');" 

Я думаю, что есть проблема с экранированием некоторых символов, но я не могу справиться с этим.

ответ

2

Предполагая Unix-подобную оболочку, в качестве альтернативы прохождения запроса с -c и сложными многоуровневым цитированием, она может быть передана в своем первоначальном виде в стандартном вводе с использованием heredoc синтаксиса:

$ psql db << EOF 
UPDATE table SET column=REGEXP_REPLACE(column, E'\[(.*)\]$', ''); 
EOF 
0

Я думаю, проблема возникла из $. Попытайтесь с:

postgres db -c "UPDATE table SET column=REGEXP_REPLACE(column, E'\\[(.*)\\]\$', '');" 

Оценивается параметр, переданный в двойной кавычки. Это означает, что он распознает специальные символы, такие как $, но параметр в простой цитате - нет.

1

Я нашел, что правильный путь:

UPDATE table SET column=REGEXP_REPLACE(column, E'\\\[(.*)\\\]$', ''); 

Я попытался вытекания в знак $, но это не помогло вообще. Я понимаю, что один из «\» - для bash, чтобы избежать другого, который необходим для db, чтобы избежать следующего.

Смежные вопросы