2012-12-10 61 views
0

我有這個奇怪的問題。我有一個有10列字符變化的表格。奇怪的SELECT行爲

我需要一個函數來搜索所有記錄並返回包含所有字符串的記錄的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%的時間,奇怪的問題是,有些行沒有找到。

它不是大寫或小寫問題。

什麼可能是錯誤的,它的版本9.1在64位勝7.我感覺它像編碼或字符串的問題,但我不明白在哪裏和什麼。

//好的我找到了問題,它必須處理所有列,如果所有24列都填充,那麼它不工作?但爲什麼 ?有限制,因爲有24列,我必須與//

有人可以幫我PLZ。

謝謝。

+0

你能在[SQLFiddle](http://sqlfiddle.com/)上設置一個顯示錯誤的例子嗎? –

+0

嗨伊戈爾,沒有錯誤,它只是返回null選定。 – user1892954

+0

如果您想要更好地解決問題,則應在此處或SQLFiddle中將一些示例傳遞和失敗的行作爲'insert'語句發佈。還可以將完整查詢和表格定義作爲'create table'語句發佈。 – dbenhur

回答

1

問題是(可能)某些列有空值。

在SQL中,任何與null的相等比較始終爲false。這延伸到與IN (...)條件一起使用的值的列表。 如果列表中的任何值爲空,即使正在查找的值位於列表中,比較也將爲false。

解決方法是確保沒有值爲空。不幸的結果是一個詳細的解決方案:

WHERE ma1 IN (COALESCE(col1, ''), COALESCE(col2, ''), ...) 
+0

謝謝波希米亞人,但沒有空值,如果它是空的,那麼它的''。它的工作大部分行,但不知何故只有一些行不工作。它的iretating,就像這行的錯誤,而不是價值觀。可以讓我們說如果ather行的值像'100'一樣工作,我將這個行的值更改爲100,但仍然不起作用。 – user1892954

+0

列上是否有索引?如果是這樣,他們可能會損壞,所以請嘗試刪除它們並重新創建它們。此外,嘗試執行'分析mytable' – Bohemian

+0

沒有索引,分析retourned沒有問題。 – user1892954

0

我懷疑波希米亞是正確的,問題是你的IN子句有關空值。另一種方法是使用Postgres的array contained in operator來執行測試。

where ARRAY[ma1,ma2,ma3,ma4] <@ ARRAY[col1,col2,...,colN] 
+0

感謝您的回答, – user1892954

+0

感謝您的回答,de table中沒有空值。我嘗試了你的解決方案,我得到這個錯誤錯誤:操作符不存在:text [] <@ character varying [] – user1892954

+0

將maX值轉換爲'character varying'或將col值轉換爲'text'。例如:'ARRAY [col1 :: text,...,colN :: text]'來解決缺少的操作錯誤。 – dbenhur