我一直在这里搜索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;
答案 0 :(得分:1)
PostgreSQL实际上不会让你测试一个空白值的整数字段(除非你使用的是一个真正古老的版本 - 8.2或更早版本),所以你必须使用一个“帮助”转换{{1的查询生成器} {}} ''
或忽略错误的工具。
观察这一点,见第9.2页:
NULL
如果您尝试测试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 = '';
,this is not correct。您必须改为使用= NULL
或IS NOT NULL
。对IS DISTINCT FROM NULL
的测试始终会生成= NULL
,在NULL
子句中将其视为false。
示例:
WHERE
顺便说一句,您应该使用ANSI JOIN语法。它更具可读性,并且更容易忘记放入条件并偶然获得笛卡尔积。我会重写您的查询以获得相同的功能和性能,但更好的可读性为:
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)
使用表别名通常可以保持清洁;为简洁起见,我将较长的名称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
。