有没有办法像自定义分隔符一样 select

Is there a way to select like with custom separator

我的 postgresql table 看起来像这样:

+----+---------------------+
| id |        names        |
+----+---------------------+
|  1 | foo|bar and biz|pop |
+----+---------------------+

我想要 select 包含名字的行。像

SELECT "id" FROM "table" WHERE "names" LIKE '%foo%';
 id
-----
1
(1 row)

如果我要求 bar and biz,我也希望查询到 return 这一行,但如果我从 bar.

询问,return 什么也没有

现在我在行的开头和结尾添加管道符号并询问 LIKE '%|bar and biz|%'。不管怎样,我想知道有没有办法在没有额外管道的情况下找到那一行。

有没有办法在 postgresql 中进行这样的查询?

UPD: 看来我对问题的解释很糟糕。嗯,我想要以下:

SELECT "id" FROM "table" WHERE "names" LIKE '%bar and biz%';
 id
-----
1
(1 row)

SELECT "id" FROM "table" WHERE "names" LIKE '%bar%';
 id
-----
(0 rows)

您尝试过以下方法吗?

where "names" = 'foo' or
      "names" LIKE 'foo|%' or 
      "names" LIKE '%|foo' or
      "names" LIKE '%|foo|%'

我刚刚检查了我的系统,它对我来说工作正常。首先,我不明白为什么你在列名中有双引号。不推荐。

我的 table 架构

CREATE TABLE table (
  id int(11) unsigned NOT NULL AUTO_INCREMENT,
  names varchar(255) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

为了获取数据,我使用了这个

SELECT id FROM table WHERE names LIKE '%foo%' or names LIKE '%bar and biz%';

更新:-

SELECT * FROM A WHERE names LIKE '%bar%';

从列名称和 table 名称中删除双引号。

首先,在单个列中存储多个值不是一个好主意:

  • SQL不擅长字符串运算
  • 此类操作不能使用索引。
  • 您不能使用外键关系来验证值。

相反,您应该使用连接点 table。 Postgres还有其他存储列表的方案,比如数组和JSON.

有时,我们会被其他人糟糕的设计决定所困。使用 like 的一种方法是:

SELECT "id"
FROM "table"
WHERE '|' || "names" || '|' LIKE '%|bar|%';

因为您的列已经用“|”分隔您可以将其转换为数组并使用包含来获得您想要的结果

SELECT "id"
FROM "table"
WHERE string_to_array(names, '|')::varchar[] @> '{bar}'::varchar[];

虽然坚持你不幸的设计,但转换为数组并使用 ANY 构造:

SELECT id
FROM   table
WHERE  'bar' = ANY (string_to_array(names, '|'));

关于 ANY@>、数组和索引:

  • Can PostgreSQL index array columns?