【问题标题】:Searching substring in PostgreSQL在 PostgreSQL 中搜索子字符串
【发布时间】:2012-10-18 10:29:33
【问题描述】:

我有一个 POstgreSQL 8.4。 我有一个表,我想使用子查询返回的子字符串(字符变化数据类型)在该表的一行(字符变化数据类型)中找到一个字符串:

SELECT  uchastki.kadnum
FROM  uchastki
WHERE kadnum LIKE (
    SELECT str
    FROM test
    WHERE str IS NOT NULL)

但是报错

ERROR:  more than one row returned by a subquery used as an expression

test.str 字段中,我在uchastki.kadnum 66:07:21 01 001:27 中有66:07:21 01 001 之类的字符串。

如何使用子查询的结果找到子字符串?

更新

表格测试:

CREATE TABLE test
(
    id serial NOT NULL,
    str character varying(255)
)
WITH (
    OIDS=FALSE
);
ALTER TABLE test OWNER TO postgres;

表 uchastki:

CREATE TABLE uchastki
(
    fid serial NOT NULL,
    the_geom geometry,
    id_uch integer,
    num_opora character varying,
    kod_lep integer,
    kadnum character varying,
    sq real,
    kod_type_opora character varying,
    num_f11s integer,
    num_opisanie character varying,
    CONSTRAINT uchastki_pkey PRIMARY KEY (fid),
    CONSTRAINT enforce_dims_the_geom CHECK (st_ndims(the_geom) = 2)
)
WITH (
    OIDS=FALSE
);
ALTER TABLE uchastki OWNER TO postgres;

【问题讨论】:

  • 认识这个熟悉的评论吗? “请提及您的 PostgreSQL 版本”。你现在知道演习了。 SQL(检查)、错误消息(检查)、PostgreSQL 版本(否)、Schema 或 SQLFiddle(否)、示例数据(否)。 /沮丧
  • test.str 列中究竟存储了什么?你能展示一些示例数据和预期的输出吗?
  • @a_horse_with_no_name test.str 它只是一个字符串。
  • @Craig Ringer 我认为我的问题是一个基本的 SQL。
  • @KliverMax 对我来说,为自己付出一些努力是体贴的,这表明你尊重别人的时间。当然,这纯粹是我的意见,但它符合网站指南和常见问题解答。此外,虽然您认为这只是基本的 SQL,但 您是在寻求帮助,所以它可能与您的想法不同。考虑阅读stackoverflow.com/tags/postgresql/info 的“如何提出更好的问题”部分。

标签: postgresql


【解决方案1】:

使用like any

SELECT  uchastki.kadnum
FROM  uchastki
WHERE kadnum LIKE  ANY(
   SELECT str
   FROM test
WHERE str IS NOT NULL)

或许:

SELECT  uchastki.kadnum
FROM  uchastki
WHERE kadnum LIKE  ANY(
   SELECT '%' || str || '%'
   FROM test
WHERE str IS NOT NULL)

这是一个不错的功能,您可以使用不同的运算符,例如= any (select ... )<> all (select...)

【讨论】:

  • 很好地猜测了海报的真实意图。 LIKE ANY (...) 的第二个公式真的有效吗?如果是这样,那就
  • @CraigRinger:是的,它会的。另一个很好的例子:... where tsvector_col @@ any(select tsquery_col...)
  • 当然可以。你在这里每天都能学到一些东西。演示:sqlfiddle.com/#!12/fc538/1
【解决方案2】:

我将在黑暗中大胆尝试,假设您的意思是要将表 A 中的字符串 Sa 与表 B 中的一个或多个其他字符串 S1 .. Sn 进行匹配以查找如果S1 .. Sn 中的任何其他字符串是Sa 的子字符串,则输出。

一个简单的例子来说明我的意思(提示,提示):

给定:

CREATE TABLE tableA (string_a text);
INSERT INTO tableA(string_a) VALUES 
('the manual is great'), ('Chicken chicken chicken'), ('bork');

CREATE TABLE tableB(candidate_str text);
INSERT INTO tableB(candidate_str) VALUES
('man'),('great'),('chicken');

我想要结果集:

the manual is great
chicken chicken chicken

因为the manual is great 里面有mangreat;因为chicken chicken chicken 里面有chicken。无需显示匹配的子字符串。 bork 不匹配任何子字符串,因此找不到。

这是带有示例数据的SQLFiddle

如果是这样,厚颜无耻地窃取@maniek 的绝妙建议,你会使用:

SELECT string_a 
FROM tableA 
WHERE string_a LIKE ANY (SELECT '%'||candidate_str||'%' FROM tableB);

(请为@maniek 投票,我只是在说明如何清楚地解释——我希望——你想要实现的目标、样本数据等)。

【讨论】:

  • 对不起我的问题质量。
  • @KliverMax 前几次没问题,我只是觉得你现在应该知道得更好了。请在您提出下一个问题之前考虑一下
【解决方案3】:

(注:此答案是在进一步讨论澄清发帖者的实际意图之前写的)

很可能在test 中存在不止一个str,其中str IS NOT NULL。这就是用作表达式的子查询返回多行的原因,也是语句失败的原因。

单独运行子查询以查看它返回的内容,然后您就会看到。也许您打算将其设为correlated subquery,但忘记了外部列引用?或者也许在外部表中有一个也称为str 的列,而您打算这样写:

SELECT  uchastki.kadnum
FROM  uchastki
WHERE kadnum LIKE (
SELECT test.str
FROM test
WHERE uchastki.str IS NOT NULL)

?

提示:在列引用上始终使用表别名有助于避免名称冲突混淆).

【讨论】:

  • 子查询返回约 200 个结果。这意味着我在 Postgre 中找不到使用多个子字符串的字符串?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2019-10-06
  • 2020-01-27
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多