Postgres: регулярные выражения и вложенные запросы, что-то вроде каналов Unix - PullRequest
0 голосов
/ 24 августа 2009

Команда должна выполнить: Дать 1 в качестве вывода, если шаблон «*@he.com» находится в строке, исключая заголовки:

 user_id | username |   email   |           passhash_md5           | logged_in | has_been_sent_a_moderator_message | was_last_checked_by_moderator_at_time | a_moderator 
---------+----------+-----------+----------------------------------+-----------+-----------------------------------+---------------------------------------+-------------
       9 | he       | he@he.com | 6f96cfdfe5ccc627cadf24b41725caa4 |         0 |                                 1 | 2009-08-23 19:16:46.316272            | 

Короче говоря, я хочу связать много команд SELECT с Regex, скорее как каналы Unix. Вывод выше от команды SELECT. Новая команда SELECT с соответствующим шаблоном должна дать мне 1.

Связано

Ответы [ 3 ]

1 голос
/ 24 августа 2009

Похоже, вы можете использовать запрос регулярного выражения для сопоставления по адресу электронной почты:

select * from table where email ~ '.*@he.com';

Чтобы вернуть 1 из этого запроса, если есть совпадение:

select distinct 1 from table where email ~ '.*@he.com';

Это вернет одну строку, содержащую столбец с 1, если есть совпадение, иначе строк вообще нет. Существует много других возможных способов создания такого запроса.

1 голос
/ 24 августа 2009

Допустим, ваш исходный запрос:

select * from users where is_active = true;

И что вы действительно хотите найти соответствие в любом столбце (что является плохой идеей по многим причинам), и вы просто хотите проверить, соответствует ли "*@he.com" какой-либо строке ( Кстати, это не правильное регулярное выражение! Правильно будет. * @ he.com, но поскольку якорей нет (^ или $), вы можете просто написать @ he.com.

select 1 from (
    select * from users where is_active = true
) as x
where textin(record_out( x )) ~ '@he.com'
limit 1;

Конечно, вы также можете выбрать все столбцы:

select * from (
    select * from users where is_active = true
) as x
where textin(record_out( x )) ~ '@he.com'
limit 1;
1 голос
/ 24 августа 2009

Вы имели в виду

SELECT regexp_matches( (SELECT whatevername FROM users WHERE username='masi'), 'masi');

Вы, очевидно, не можете подать запись (*) на regexp_matches, но я предполагаю, что это не та проблема, с которой вы столкнулись, поскольку вы упоминаете проблему вложенности SQL-запросов в теме.

Может быть, вы имели в виду что-то вроде

SELECT regexp_matches( wn, 'masi' ) FROM (SELECT whatevername AS wn FROM users WHERE username LIKE '%masi%') AS sq;

для случая, когда ваш подзапрос дает несколько результатов.

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