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 では実際に空白値の整数フィールドをテストすることはできません (NULL真に古いバージョン (8.2 以前) を使用している場合を除く)。エラー。

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 NULLorを使用する必要があります。alwaysIS DISTINCT FROM NULLのテストの結果は になり、句では false として扱われます。= NULLNULLWHERE

例:

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 に答える