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

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

在 SQL 中,任何与 null 的相等比较总是错误的。这扩展到与IN (...)条件一起使用的值列表。如果列表中的任何值为空,则比较将为假,即使正在寻找的值在列表中也是如此。

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

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

我怀疑 Bohemian 是正确的,该问题与您的 IN 子句中的空值有关。另一种方法是使用包含在运算符中的 Postgres 数组来执行测试。

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