0

我一直在 stackoverflow 和其他来源上搜索,但没有找到解决方案

下面的查询按预期工作,custinfo.cust_cntct_id或者custinfo.cust_corrcntct_id = ''(空白不是NULL)然后我没有得到任何结果。两者都是整数字段,如果两者都有整数值,那么我会得到结果。我仍然希望返回一个值,cntct_email或者corrcntct_email即使custinfo.cust_cntct_id或者custinfo.cust_corrcntct_id = blank

有人可以帮我完成这项工作吗?数据库是 PostgreSQL。

SELECT 
  cntct.cntct_email AS cntct_email, 
  corrcntct.cntct_email AS corrcntct_email
FROM 
  public.custinfo, 
  public.invchead, 
  public.cntct, 
  public.cntct corrcntct
WHERE 
  invchead.invchead_cust_id = custinfo.cust_id AND
  cntct.cntct_id = custinfo.cust_cntct_id AND
  corrcntct.cntct_id = custinfo.cust_corrcntct_id;
4

1 回答 1

1

PostgreSQL 实际上不会让您测试一个整数字段的空白值(除非您使用的是真正古老的版本 - 8.2 或更早版本),因此您必须使用“有帮助”转换''为的查询生成器NULL或忽略的工具错误。

在 Pg 9.2 上观察这一点:

regress=> CREATE TABLE test ( a integer );
CREATE TABLE
regress=> insert into test (a) values (1),(2),(3);
INSERT 0 3
regress=> SELECT a FROM test WHERE a = '';
ERROR:  invalid input syntax for integer: ""
LINE 1: SELECT a FROM test WHERE a = '';

如果您试图测试= NULL这是不正确的。您必须使用IS NOT NULLorIS DISTINCT FROM NULL代替。测试= NULLalways 会导致,这在子句NULL中被视为 false 。WHERE

例子:

regress=> insert into test (a) values (null);
INSERT 0 1

regress=> SELECT a FROM test WHERE a = NULL;
 a 
---
(0 rows)

regress=> SELECT a FROM test WHERE a IS NULL;
 a 
---

(1 row)

regress=> SELECT NULL = NULL as wrong, NULL IS NULL AS right;
 wrong | right 
-------+-------
       | t
(1 row)

顺便说一句,你真的应该使用 ANSI JOIN 语法。它更具可读性,并且更容易忘记输入条件并意外获得笛卡尔积。我会重写您的查询以获得相同的功能和性能但更好的可读性:

SELECT 
  cntct.cntct_email AS cntct_email, 
  corrcntct.cntct_email AS corrcntct_email
FROM 
  public.custinfo ci
  INNER JOIN public.invchead
    ON (invchead.invchead_cust_id = ci.cust_id)
  INNER JOIN public.cntct 
    ON (cntct.cntct_id = ci.cust_cntct_id)
  INNER JOIN public.cntct corrcntct 
    ON (corrcntct.cntct_id = ci.cust_corrcntct_id);

使用表别名通常会使它更干净;custinfo在这里,为了简洁起见,我将较长的名称别名ci为。

于 2012-10-29T08:48:50.753 回答