1

我有一个 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 001in的字符串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;
4

3 回答 3

11

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

于 2012-10-18T11:11:48.380 回答
3

我将在黑暗中大胆尝试,假设您的意思是要将 table 中的一个字符串与 table 中的一个或多个其他字符串进行匹配,SaA找出其中的任何其他字符串是否是.S1 .. SnBS1 .. SnSa

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

鉴于:

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 greatman并且great在其中;因为里面chicken chicken chickenchicken。无需显示匹配的子字符串。bork不匹配任何子字符串,因此找不到。

这是带有示例数据的SQLFiddle 。

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

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

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

于 2012-10-18T11:18:29.610 回答
1

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

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

单独运行子查询以查看它返回的内容,您将看到。也许您希望它是一个相关的子查询,但忘记了外部列引用?或者也许在外部表中也有一个列str,您打算写:

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

?

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

于 2012-10-18T10:32:47.540 回答