我有一个以下格式的PostgreSQL表:
uid | defaults | settings
-------------------------------
abc | ab, bc | -
| |
pqr | pq, ab | -
| |
xyz | xy, pq | -
我正在尝试列出defaults
列中包含ab的所有uid。在上述情况下,必须列出abc
和pqr
。
如何构建查询并在表中循环以检查bash中的每一行?
答案 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
是可选的。