Практический пример подстроки Postgres или regexp_matches - PullRequest
1 голос
/ 04 августа 2010

Я пытался выяснить следующее в течение пары дней. Пожалуйста, ПОМОГИТЕ

Таблица PostgreSQL: местоположения

Id         State

--------------------
1          New York

2          Texas

input = 'Привет из Техаса всем Ковбоям'

вывод: строка, содержащая Техас

SELECT id, state FROM locations WHERE state ~* substring(input from state)

Ответы [ 3 ]

4 голосов
/ 04 августа 2010

1.

select * from locations where 'Greetings from Texas to all Cowboys' ~ State;

2

select * from locations where State = any(string_to_array('Greetings from Texas to all Cowboys',' '));

Оба метода, описанные выше, имеют некоторые проблемы в некоторых обстоятельствах. Но я хочу знать, предназначены ли они для вас.

3.

select * from locations where 'reetings from Texas to all Cowboys' ~* ('\\m' || state || '\\M');

Последний способ был бы лучше.

2 голосов
/ 04 августа 2010

Поисковое слово не является шаблоном. Попробуйте это:

select * from locations where 'Hello from Texas!' like '%' || state || '%';

или это:

select * from locations where 'Hello from Texas!' ~* ('.*' || state || '.*');

, если вы хотите Posix регулярные выражения.

Пример:

# create table locations(id integer, state text);
CREATE TABLE
# insert into locations values  (1,'New York'),(2,'Texas') ;
INSERT 0 2
# select * from locations where 'Hello from Texas!' like '%' || state || '%';
 id | state
----+-------
  2 | Texas
(1 row)

# select * from locations where 'Hello from Texas!' ~* ('.*' || state || '.*');
 id | state
----+-------
  2 | Texas
(1 row)

# select * from locations where 'Greetings from you ex' like '%' || state || '%';
 id | state
----+-------
(0 rows)

# select * from locations where 'Greetings from your ex' ~* ('.*' || state || '.*');
 id | state
----+-------
(0 rows)

Это требует некоторого уточнения или курса, если вам нужно определить границы слов:

# select * from locations where 'fakulos greekos metexas' ~* ('.*' || state || '.*');
id | state
----+-------
2 | Texas

Если в ваших поисковых словах есть метасимволы регулярных выражений (см. Документацию PostgresSQL в качестве списка), то вам, возможно, придется сначала заключить их в кавычки. Это выглядит немного странно, но вот как всегда выглядит выход из ситуации:

select regexp_replace('Dont mess (with) Texas, The Lone *',E'([\(\)\*])',E'\\\\\\1','g');

([\(\)\*]) - это список символов, которые вы хотите экранировать.

Однако, если вам никогда не нужны регулярные выражения в ваших поисковых словах, тогда может быть проще использовать простую функцию поиска строк, например strpos ():

select strpos('Dont mess (with) Texas','Texas')>0;
?column?
--------
t

select strpos('Dont mess (with) Texas','Mars')>0;
?column?
--------
f

Вы можете использовать upper(), если хотите сравнивать без учета регистра

select strpos(upper('Dont mess (with) Texas'),upper('teXas'))>0;
?column?
--------
t
1 голос
/ 04 августа 2010

Я хотел бы взглянуть на полнотекстовый поиск:

SELECT 
    id, 
    state 
FROM 
    locations 
WHERE  
    to_tsvector('english', 'Greetings from Texas to all Cowboys') @@ plainto_tsquery('english', state);

Стандарт доступен начиная с версии 8.3, в более старых версиях вы должны установить tsearch2 из вклада.

http://www.postgresql.org/docs/current/interactive/textsearch.html

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