通过bash中的PostgreSQL表循环

时间:2013-08-14 10:45:18

标签: sql bash postgresql

我有一个以下格式的PostgreSQL表:

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

我正在尝试列出defaults列中包含ab的所有uid。在上述情况下,必须列出abcpqr

如何构建查询并在表中循环以检查bash中的每一行?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

使用awk:

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

说明:

  • -F\|将字段分隔符设置为|字符
  • 使用$2~/ab/我们会过滤第二列中包含“ab”的行。
  • 使用print $1打印匹配行的第一列。

答案 2 :(得分: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是可选的。