SQL - Как избежать скобок в PostgreSQL - PullRequest
5 голосов
/ 03 июня 2011

У меня есть следующая команда sql, мне нужно избегать скобок в PostgreSQL, как я могу это сделать?

SELECT rua 
  FROM logradouros 
 WHERE rua ~* 'Antonio De Sant\'Ana Galvao Av Frei (Av 01 Parte A)' 
 LIMIT 100;

Ответы [ 6 ]

3 голосов
/ 03 июня 2011

Вообще говоря, котировка доллара - ваша лучшая ставка. Обратите внимание:

SELECT $STR$Antonio De Sant\'Ana Galvao Av Frei (Av 01 Parte A)$STR$;
-----------------------------------------------------
 Antonio De Sant\'Ana Galvao Av Frei (Av 01 Parte A)
(1 row)
2 голосов
/ 03 июня 2011

Используйте обратную косую черту, чтобы избежать скобок. Обратите внимание, что если параметр standard_conforming_strings отключен (это поведение по умолчанию до PostgreSQL 9.1), вам необходимо использовать две обратные косые черты \\.

Как правило, есть три подхода, как избежать скобок:

  • обычный 'pattern' синтаксис, который зависит от настройки standard_conforming_strings
  • экранированная строковая константа, например E'pattern'
  • строковые константы в кавычках $$pattern$$ или $sometext$pattern$sometext$

Первый - это стандартный SQL (особенно с standard_conforming_strings), другие - расширения PostgreSQL. Выберите любой метод, который вам нравится.

Вот несколько примеров:

SET standard_conforming_strings = 0;

SELECT
'Antonio De Sant''Ana Galvao Av Frei (Av 01 Parte A)'
~* 
'Antonio De Sant\'Ana Galvao Av Frei \\(Av 01 Parte A\\)'

SET standard_conforming_strings = 1;

SELECT
'Antonio De Sant''Ana Galvao Av Frei (Av 01 Parte A)'
~* 
'Antonio De Sant''Ana Galvao Av Frei \(Av 01 Parte A\)'

SELECT
'Antonio De Sant''Ana Galvao Av Frei (Av 01 Parte A)'
~* 
E'Antonio De Sant\'Ana Galvao Av Frei \\(Av 01 Parte A\\)'

SELECT
'Antonio De Sant''Ana Galvao Av Frei (Av 01 Parte A)'
~* 
$$Antonio De Sant'Ana Galvao Av Frei \(Av 01 Parte A\)$$

SET standard_conforming_strings = default;
1 голос
/ 03 июня 2011

Попробуйте это:

SELECT rua from logradouros where rua ~* E'Antonio De Sant\'Ana Galvao Av Frei \(Av 01 Parte A\)' limit 100;

Ссылка: http://www.postgresql.org/docs/8.2/static/sql-syntax-lexical.html

0 голосов
/ 03 декабря 2017

Что касается регулярного выражения, Вы должны использовать двойные обратные слэши прямо перед скобками !!

Например:

select regexp_matches('FOREIGN KEY (user_transaction_id) REFERENCES landing.user_transactions(id)', E'FOREIGN KEY \\((.*)\\) REFERENCES (.*)\\((.*)\\)', 'g');

Результат:

"{user_transaction_id,landing.user_transactions,id}"
0 голосов
/ 02 декабря 2016

просто используйте 2 ' '

select * from games where name = 'Ahmed''s Salah'

обратный слеш (а) у меня не работает

0 голосов
/ 30 января 2014

Хотя любой другой ответ помогает, я просто считаю, что использование функций цитирования - это «правильный» способ сделать это.

из документов :

quote_literal (string text) text Возвращает заданную строку, заключенную в соответствующие кавычки, для использования в качестве строкового литерала в строке оператора SQL. Встроенные одинарные кавычки и обратные слэши корректно удваиваются. Обратите внимание, что quote_literal возвращает ноль при нулевом вводе; если аргумент может быть нулевым, quote_nullable часто более подходит. Смотрите также Пример 39-1. quote_literal (E'O \ 'Reilly') 'O''Reilly'

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