2013-08-14 3 views
2

У меня есть таблица PostgreSQL в следующем формате:Перебор таблицы PostgreSQL в Баш

uid | defaults | settings 
------------------------------- 
abc | ab, bc  |  - 
    |    | 
pqr | pq, ab  |  - 
    |    | 
xyz | xy, pq  |  - 

Я пытаюсь перечислить все идентификаторы, которые содержат аЬ в defaults колонке. В приведенном выше случае должны быть указаны abc и pqr.

Как сформировать запрос и зациклировать его вокруг таблицы, чтобы проверить каждую строку в bash?

ответ

2

Это не о bash, но вы можете вызвать команду запроса с помощью psql. Вы можете попробовать этот формат:

psql -U username -d database_name -c "SELECT uid FROM table_name WHERE defaults LIKE 'ab, %' OR defaults LIKE '%, ab' 

Или, может быть, просто

psql -U username -d database_name -c "SELECT uid FROM table_name WHERE defaults LIKE '%ab%' 

-U username не является обязательным.

+0

Я нахожу это проще. Запрос возвращает то, что мне нужно, но он также возвращает 'ab', если' ab' находится под uid. – rahuL

+0

Я сделал исправление по первому. '' *, ab'' должно быть ''%, ab''. – konsolebox

2

Использование AWK:

awk -F\| '$2~/ab/{print $1}' file 

Объяснение:

  • -F\| устанавливает поле Seperator к | характера
  • С $2~/ab/ мы отфильтровать строки, содержащие "AB" во второй колонке ,
  • С print $1 мы печатаем первый столбец для строк, соответствующих друг другу.
3

@user000001 already provided the bash part. И запрос может быть:

SELECT uid 
FROM tbl1 
WHERE defaults LIKE '%ab%' 

Но это по своей сути ненадежны, так как это было бы также найти «Fab» или «ABZ». Также трудно создать быстрый индекс.

Рассмотрите нормализуя свою схему. Это означает, что у вас будет другая таблица 1: n tbl2 с записями для отдельных значений по умолчанию и внешним ключом до tbl1. Тогда ваш запрос может быть:

SELECT uid 
FROM tbl1 t1 
WHERE EXISTS 
    (SELECT 1 
    FROM tbl2 t2 
    WHERE t2.def = 'ab' -- "default" = reserved word in SQL, so I use "def" 
    AND t2.tbl1_uid = t1.uid); 

Или, по крайней мере, использовать массив для defaults. Тогда ваш запрос будет выглядеть так:

SELECT uid 
FROM tbl1 
WHERE 'ab' = ANY (defaults);