查询整数不起作用

时间:2012-10-29 08:42:29

标签: database postgresql

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

以下查询按预期的方式运行,当custinfo.cust_cntct_idcustinfo.cust_corrcntct_id = ''(空白而不是NULL)时,我得不到任何结果。两者都是整数字段,如果两者都有整数值,那么我得到结果。即使cntct_emailcorrcntct_email

,我仍希望为custinfo.cust_cntct_idcustinfo.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;

1 个答案:

答案 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。您必须改为使用= NULLIS 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