备忘录

2025 年 1 月1 条备忘录

更新于
公开 · 所有人可见

ChatGPT

Q

PG 有个字段 paths 是个列表的 string, 我现在要去 列表中包含 abc 的列

A

在 PostgreSQL 中,如果你有一个字段 paths 是一个字符串列表(数组),并且你需要查询列表中包含特定字符串(例如 abc)的记录,可以使用 ANY 或 unnest 结合 LIKE 来实现。

以下是两种实现方式:

1. 使用 ANY

SELECT *
FROM your_table
WHERE 'abc' = ANY(paths);

这种方法适用于 完全匹配 的情况。如果你需要匹配包含 abc 的字符串,可以结合 array_to_string 或使用更复杂的条件:

SELECT *
FROM your_table
WHERE EXISTS (
    SELECT 1
    FROM unnest(paths) AS path
    WHERE path LIKE '%abc%'
);

2. 使用 unnest 和 LIKE

如果你想解开数组并对其应用更复杂的字符串匹配,可以使用 unnest:

SELECT DISTINCT t.*
FROM your_table t
JOIN LATERAL unnest(t.paths) AS path ON path LIKE '%abc%';

解释

  1. unnest(paths):将数组字段解包为单独的行。
  2. LIKE '%abc%':匹配数组中的字符串是否包含 abc。
  3. DISTINCT:防止由于数组中多个值匹配而导致重复的结果。

如果你想要查询结果只返回匹配的字段而不是整个记录,可以改为:

SELECT t.id, path
FROM your_table t
JOIN LATERAL unnest(t.paths) AS path ON path LIKE '%abc%';

这里 t.id 是你的主键字段,path 是匹配的具体值。

你可以根据需求选择合适的方法。