[英]Looping through a PostgreSQL table in bash
我有以下格式的PostgreSQL表:
uid | defaults | settings
-------------------------------
abc | ab, bc | -
| |
pqr | pq, ab | -
| |
xyz | xy, pq | -
我試圖列出defaults
列中包含ab的所有uid。 在上述情況下,必須列出abc
和pqr
。
如何形成查詢並在表中循環以檢查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.