2015-01-07 2 views
0

Есть ли способ сделать что-то вроде grep для «сайта» из следующего выбора (так что из данных возвращается только «сайт = *»)?postgres search in column with escapes

rr=# select thename,encode(thedata, 'escape') from 
management_data.datas limit 2; 
     thename   | thedata                                            

----------------------------------------------------------------------------------- 
Alexander     | # 
                       + 
            | #Fri Mar 15 14:58:18 PDT 2014 
                       + 
            | BUs=ALL 
                       + 
            | site=33$36$354$380$357$360$36$353$36$38$39$34$31$355 
                       + 
Anthony      | # 
                       + 
            | #Mon Jan 05 13:33:00 PST 2015 
                       + 
            | mem=12000 
                       + 
            | site=50$5$1$50 
                       + 
            | 
+0

Каково определение схемы для таблицы данных? –

+0

@ DavidChan 'Column | Тип | Модификаторы | Хранение | Цель статистики | Описание ---------------- + ------------------------ + ------ ------------------------------------------------- + ---------- + -------------- + ------------- thename | различный характер (80) | не null | расширенный | | thedata | bytea | | расширенный | | ' – user3486527

+0

Какой ужасный способ хранить информацию - вы, кажется, вставляете ее в blob. Это будет совсем не интересно получать запросы от SQL. (Кстати, http://sqlfiddle.com/ было бы удобно,). –

ответ

0

Приведенные данные теста круглые споткнулся успешно:

WITH somerow(name, blobofgarble) AS (
    SELECT 
     TEXT 'Alexander', 
     BYTEA E'#\n#Fri Mar 15 14:58:18 PDT 2014\nBUs=ALL\nsite=33$36$354$380$357$360$36$353$36$38$39$34$31$355\n' 
) 
SELECT name, encode(blobofgarble, 'escape') FROM somerow; 

Теперь, я не могу себе представить, почему вы бы хранить эту информацию в качестве bytea а не text поле, но ... ну, Наверное, должна быть причина. Я буду полагаться на упрощающее предположение о том, что данные при сбежании могут рассматриваться как довольно разумно сформированные text, так как в противном случае вся концепция «линий» является мусором, и ваш вопрос не имеет смысла.

С этого предположения можно использовать regexp_split_to_table разделить на переводы строк, получить несколько более здраво сформированную данные:

WITH (...) 
SELECT name, garblepart FROM somerow, regexp_split_to_table(encode(blobofgarble, 'escape'), E'\n') AS garblepart; 

    name |    garblepart    
-----------+------------------------------------------------------ 
Alexander | # 
Alexander | #Fri Mar 15 14:58:18 PDT 2014 
Alexander | BUs=ALL 
Alexander | site=33$36$354$380$357$360$36$353$36$38$39$34$31$355 
Alexander | 
(5 rows) 

(это неявный LATERAL запрос, поэтому он будет работать только в PostgreSQL 9.3 и выше).

Теперь вы можете использовать довольно обычные операции, чтобы найти ряд интересных и извлечь нужную часть, в данном случае с некоторым более сопоставлением с образцом:

WITH (...) 
SELECT 
    name, substring(garblepart from '=(.*$)') 
FROM somerow, 
    regexp_split_to_table(encode(blobofgarble, 'escape'), E'\n') AS garblepart 
WHERE garblepart LIKE 'site=%'; 

    name |     substring      
-----------+------------------------------------------------- 
Alexander | 33$36$354$380$357$360$36$353$36$38$39$34$31$355 
(1 row) 

Теперь идет исправить вашу схему так, что вы храните ваши данные безопасны и не нужно это делать.

+0

Ты бог среди мужчин. Это потрясающе. Вы прекрасны. – user3486527