2011-07-08 10 views
2

このクエリはPHPによって動的に生成されるため、このクエリを簡略化しようとしています。処理オーバーヘッドを減らしたいのですが(実際のクエリははるかに長くなりますが、同じだろう!)。PostgreSQLの簡略化エイリアスを使用したtsvectorとtsquery

SELECT title, type_name, ts_rank_cd(ARRAY[0.1,0.2,0.4,1.0], 
setweight(to_tsvector(coalesce(title,'')), 'A') 
|| 
setweight(to_tsvector(coalesce(type_name,'')), 'B') 
, 
to_tsquery('search & query')) 
FROM TestView WHERE 
setweight(to_tsvector(coalesce(title,'')), 'D') 
|| 
setweight(to_tsvector(coalesce(type_name,'')), 'B') 
@@ 
to_tsquery('search & query'); 

私はそれが2回指定する必要がないように、エイリアスのようなものを定義することによって、二回のtsqueryとのtsvectorを指定する必要性を減らすためにしようとしていますよ。このような何か(訂正しても、近い場合は失敗する、私はわからない!)

SELECT title, type_name, ts_rank_cd(ARRAY[0.1,0.2,0.4,1.0], 
searchvector 
, 
searchquery 
FROM TestView WHERE 
setweight(to_tsvector(coalesce(title,'')), 'D') 
|| 
setweight(to_tsvector(coalesce(type_name,'')), 'B') AS searchvector 
@@ 
to_tsquery('search & query') AS searchquery; 

これが可能であるか、私は2回だけそれをすべてを生成して立ち往生しています。

コンテキスト 'TestView'は、いくつかのテーブルから生成されたビューです。

ご迷惑をおかけして申し訳ありません。

答えて

1
SELECT title, 
     type_name, 
     ts_rank_cd(ARRAY[0.1,0.2,0.4,1.0],weight,query) 
FROM (
    SELECT title, 
      type_name, 
      setweight(to_tsvector(coalesce(title,'')), 'A') 
       ||setweight(to_tsvector(coalesce(type_name,'')), 'B') as weight, 
      to_tsquery('search & query') as query 
    FROM TestView 
) t 
WHERE weight @@ query 
+0

おかげでそれはまだ失敗... ERROR:構文エラーがでたり近く LINE 7 "と":重量として... tweight(to_tsvector(合体(タイプ名、 ''))、 'B') 、 –

+0

私はts_rank_cd()の呼び出しを誤解したと思います。新しいクエリを試してください。しかし、とにかく、それはあなたにこれに対処する方法を与える必要があります。 –

+0

あなたの新しい編集でエラーが発生しました:関数ts_rank_cd(数値[])が存在しません。これは5行目の括弧が間違っていると思われますが、これを削除すると上記のエラーがスローされます。 ts_rank_cd paramsは、ランク配列、tsvector、tsqueryです。ご協力いただきありがとうございます。とても有難い。 –

関連する問題