2

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

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

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

如何形成查询并在表格周围循环以检查 bash 中的每一行?

4

3 回答 3

3

@user000001 已经提供了 bash 部分。查询可能是:

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);
于 2013-08-14T10:54:48.990 回答
2

使用 awk:

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

解释:

  • -F\|字段分隔符设置为|字符
  • 我们过滤了$2~/ab/第二列中包含“ab”的行。
  • print $1我们打印匹配行的第一列。
于 2013-08-14T10:50:40.017 回答
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是可选的。

于 2013-08-14T10:59:58.817 回答