我有一个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;
答案 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
中有man
和great
;因为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
test
中str 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}}
(提示:在列引用上始终使用表别名有助于避免名称冲突混淆)。