我有这个奇怪的问题。我有一个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列我必须与//
进行比较有人能帮助我吗?
感谢。
答案 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]