奇怪的SELECT行为

时间:2012-12-10 22:14:43

标签: string postgresql

我有这个奇怪的问题。我有一个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%的时间工作,奇怪的问题是找不到某些行。

它不是大写或小写的问题。

什么可能是错的,它的版本9.1在64位赢7.我觉得它像编码或字符串问题,但我看不到在哪里和什么。

//好的我发现了问题,它与所有列有关,如果所有24列都被填入然后它不工作?但为什么 ?有限制因为有24列我必须与//

进行比较

有人能帮助我吗?

感谢。

2 个答案:

答案 0 :(得分:1)

问题是(可能)你的某些列有空值。

在SQL中,与null的任何相等性比较始终为false。这扩展到与IN (...)条件一起使用的值列表。 如果列表中的任何值为null,则比较将为false,即使要搜索的值在列表中也是如此。

解决方法是确保没有值为null。不幸的是,这导致了一个冗长的解决方案:

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

答案 1 :(得分:0)

我怀疑波希米亚语是正确的,问题与你的IN子句中的空值有关。另一种方法是使用Postgres的array contained in operator来执行测试。

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