0

ステートメントを使用して変数を連結しようとしていますLIKEが、何らかの理由で、検索する単語がテキスト変数の最後にある値のみが検出されます。

PostgreSQL 8.4を使用していますが、これは関数に格納されています(ストアドプロシージャ)

この例で考える:

a.key1は「HELLO」です

a_textは「ISAYHELLOTOTHEWORLD」です

コード:

SELECT count(1), a.key1, a.active, a.campkeydbid
    FROM campkeydb a
WHERE a_text LIKE '%'|| a.key1 ||'%'
   GROUP BY a.key1, a.active, a.campkeydbid
INTO a_count, a_campaignkey, a_active, a_campkeydbid; 

このストアドプロシージャでは、値は返されません。「HELLO」という単語が見つかりませんか?

a_textに「ISAYHELLO 」が含まれている場合にのみ値を返します

誰かが私が間違っていることを知っていますか?変数a.key1の両側にを連結しているので、正しいようです。

4

1 に答える 1

1

likeの代わりにpositionstring関数を使用できます。これは、フランスの地方と県の表を使用したクエリの例です。地域名を含む名前を持つすべての部門を探してみます。

select r.name as region, d.name as deprtment, position( r.name in d.name) as pos
from regions r
join departments d on d.region = r.code
where position( r.name in d.name) != 0
and r.name != d.name;

結果は

region  department     pos
"Corse" "Corse-du-Sud"  1
"Corse" "Haute-Corse"   7

文字列が0ではなく1からインデックス付けされることを示すために、pos列を追加しました。「like」で同じことを試しました(両方のクエリのクエリプランは同じで、同じパフォーマンスが得られるはずです)。

select r.name as region, d.name as deprtment, position( r.name in d.name) as pos
from regions r
join departments d on d.region = r.code
where d.name like '%' || r.name || '%'
and r.name != d.name;

最初のクエリの外観は気に入っていますが、どちらも同じことをします。つまり、ロジックは正しいように見えるので、これは文字列のタイプミスのように見えます。

于 2012-07-06T06:41:39.123 に答える