0

私はこの奇妙な問題を抱えています。タイプ文字が異なる10列のテーブルがあります。

すべてのレコードを検索し、すべての文字列を持つレコードの ID を返す関数が必要です。レコードを考えてみましょう:

1. a,b,c,d,e
2. a,k,l,h
3. f,t,r,e,w,q

この関数 func(a,d) を呼び出すと 1 が返され、func(e,w,q) を呼び出すと 3 が返されます。

機能は

CREATE OR REPLACE FUNCTION func(ma1 character varying,ma2 character varying,ma3 character varying,ma4 character varying)
DECLARE name numeric; 
BEGIN
 SELECT Id INTO name from Table WHERE
  ma1 IN (col1,col2,col3,col4) AND
  ma2 IN (col1,col2,col3,col4) AND
  ma3 IN (col1,col2,col3,col4) AND
  ma4 IN (col1,col2,col3,col4);
RETURN name;
END;

90% の確率で動作していますが、いくつかの行が見つからないという奇妙な問題があります。

大文字小文字の問題ではありません。

何が間違っている可能性がありますか。64 ビットの win 7 のバージョン 9.1 です。エンコーディングまたは文字列の問題のように感じますが、どこが何なのかわかりません。

//わかりました、問題が見つかりました。それはすべての列に関係しています.24列すべてが入力されている場合、動作していません?? しかし、なぜ ?比較しなければならない列が 24 あるため、制限はありますか //

誰か助けてくれませんか。

ありがとう。

4

2 に答える 2

1

問題は (おそらく) 一部の列に null があることです。

SQL では、NULL との等価比較は常に false です。これは、条件で使用される値のリストに拡張されIN (...)ます。リスト内のいずれかの値が null の場合、検索対象の値がリスト内にある場合でも、比較は false になります。

回避策は、値が null でないことを確認することです。残念ながら、冗長な解決策になります。

WHERE ma1 IN (COALESCE(col1, ''), COALESCE(col2, ''), ...)
于 2012-12-10T22:50:49.723 に答える
0

問題が IN 句の null に関連していることは、ボヘミアンが正しいと思います。別のアプローチは、オペレーターに含まれる Postgres の配列を使用してテストを実行することです。

where ARRAY[ma1,ma2,ma3,ma4] <@ ARRAY[col1,col2,...,colN]
于 2012-12-11T01:26:30.370 に答える