簡體   English   中英

通過bash中的PostgreSQL表循環

[英]Looping through a PostgreSQL table in bash

我有以下格式的PostgreSQL表:

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

我試圖列出defaults列中包含ab的所有uid。 在上述情況下,必須列出abcpqr

如何形成查詢並在表中循環以檢查bash中的每一行?

@ 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);

使用awk:

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

說明:

  • -F\\| 將字段分隔符設置為| 字符
  • 使用$2~/ab/我們過濾第二列中包含“ab”的行。
  • 使用print $1我們為匹配的行打印第一列。

它與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是可選的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM