有没有办法像自定义分隔符一样 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?
我的 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
.
现在我在行的开头和结尾添加管道符号并询问 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?