1

私はPOStgreSQL 8.4を持っています。テーブルがあり、サブクエリによって返された部分文字列 (データ型が異なる文字) を使用して、このテーブルの 1 つの行 (データ型が異なる文字) で文字列を検索したい:

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 001uchastki.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 の1つ以上の他の文字列と照合して、 の他の文字列のいずれかが の部分文字列であるかどうかを調べたいと考えている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 greatているためです。が含まれているためです。一致した部分文字列を表示する必要はありません。どの部分文字列とも一致しないため、見つかりません。mangreatchicken chicken chickenchickenbork

サンプル データを含む 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

(注:この回答は、さらなる議論が投稿者の実際の意図を明確にする前に書かれました)

where にstr複数ある可能性が高いようです。これが、式として使用されるサブクエリによって複数の行が返される理由であり、したがって、ステートメントが失敗する理由です。teststr 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 に答える