在PostgreSQL中搜索子字符串

时间:2012-10-18 10:29:33

标签: postgresql

我有一个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字段中,66:07:21 01 001 uchastki.kadnum中有66:07:21 01 001:27字符串。

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

更新

表测试:

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;

3 个答案:

答案 0 :(得分:7)

使用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...)

答案 1 :(得分:3)

我将在黑暗中进行狂野的刺杀,并假设您想要将表Sa中的字符串A与一个或多个其他字符串S1 .. Sn进行匹配表B以查明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投票,我只是说明如何清楚解释 - 我希望 - 你想要实现的目标,样本数据等)。

答案 2 :(得分:1)

(注:这个答案是在进一步讨论澄清海报的实际意图之前写的)

str teststr IS NOT NULL很可能有多个str。这就是用作表达式的子查询返回多行的原因,也就是说,语句失败的原因。

单独运行子查询以查看它返回的内容,您将看到。也许您打算将其作为correlated subquery,但忘记了外部列参考?或者在外表中也有一个名为SELECT uchastki.kadnum FROM uchastki WHERE kadnum LIKE ( SELECT test.str FROM test WHERE uchastki.str IS NOT NULL) 的列,您打算写:

{{1}}

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