1

列「kladr_full_name」のSQLエラーnull値がnull以外の制約に違反しています。

リクエストが実行されるデータベース内のテーブル:

СREATE TABLE kladr.kladr_name
(
  kladr_code character varying(255) NOT NULL,
  kladr_city_name character varying(121),
  kladr_full_name character varying(487) NOT NULL,
  kladr_index character varying(6),
  kladr_name character varying(100) NOT NULL,
  kladr_naspunkt_name character varying(121),
  kladr_rayon_name character varying(121),
  kladr_region_name character varying(121),
  kladr_socr character varying(20),
  CONSTRAINT kladr_name_pkey PRIMARY KEY (kladr_code )
)
WITH (
  OIDS=FALSE
);
ALTER TABLE kladr.kladr_name
  OWNER TO postgres;

データベースへのリクエスト:

    INSERT INTO kladr.kladr_name 
            (kladr_code, 
             kladr_name, 
             kladr_socr, 
             kladr_index, 
             kladr_region_name, 
             kladr_rayon_name, 
             kladr_city_name, 
             kladr_naspunkt_name, 
             kladr_full_name) 
SELECT kladr_code, 
       Upper(kladr_name)                 kladr_name, 
       kladr_socr, 
       kladr_index, 
       (SELECT k1.kladr_socr 
               ||' ' 
               ||k1.kladr_name 
        FROM   kladr.kladr_tmp k1 
        WHERE  k1.kladr_region = k.kladr_region 
               AND k1.kladr_rayon = '000' 
               AND k1.kladr_city = '000' 
               AND k1.kladr_nas_punkt = '000' 
               AND k1.kladr_mod = '00' 
               AND k1.kladr_status = '0')kladr_region_name, 
       (SELECT k1.kladr_socr 
               ||' ' 
               ||k1.kladr_name 
        FROM   kladr.kladr_tmp k1 
        WHERE  k1.kladr_region = k.kladr_region 
               AND k1.kladr_rayon = k.kladr_rayon 
               AND k1.kladr_rayon <> '000' 
               AND k1.kladr_city = '000' 
               AND k1.kladr_nas_punkt = '000' 
               AND k1.kladr_name = '00') kladr_rayon_name, 
       (SELECT k1.kladr_socr 
               ||' ' 
               ||k1.kladr_name 
        FROM   kladr.kladr_tmp k1 
        WHERE  k1.kladr_region = k.kladr_region 
               AND k1.kladr_rayon = k.kladr_rayon 
               AND k1.kladr_city = k.kladr_city 
               AND k1.kladr_city <> '000' 
               AND k1.kladr_nas_punkt = '000' 
               AND k1.kladr_mod = '00')  kladr_city_name, 
       (SELECT k1.kladr_socr 
               ||' ' 
               ||k1.kladr_name 
        FROM   kladr.kladr_tmp k1 
        WHERE  k1.kladr_region = k.kladr_region 
               AND k1.kladr_rayon = k.kladr_rayon 
               AND k1.kladr_city = k.kladr_city 
               AND k1.kladr_nas_punkt = k.kladr_nas_punkt 
               AND k1.kladr_nas_punkt <> '000' 
               AND k1.kladr_mod = '00')  kladr_naspunkt_name, 
       (SELECT k1.kladr_socr 
               ||' ' 
               ||k1.kladr_name 
        FROM   kladr.kladr_tmp k1 
        WHERE  k1.kladr_region = k.kladr_region 
               AND k1.kladr_rayon = '000' 
               AND k1.kladr_city = '000' 
               AND k1.kladr_nas_punkt = '000' 
               AND k1.kladr_mod = '00' 
               AND k1.kladr_status = '0') 
       ||' ' 
       ||(SELECT k1.kladr_socr 
                 ||' ' 
                 ||k1.kladr_name 
          FROM   kladr.kladr_tmp k1 
          WHERE  k1.kladr_region = k.kladr_region 
                 AND k1.kladr_rayon = k.kladr_rayon 
                 AND k1.kladr_rayon <> '000' 
                 AND k1.kladr_city = '000' 
                 AND k1.kladr_nas_punkt = '000' 
                 AND k1.kladr_mod = '00') 
       ||' ' 
       ||(SELECT k1.kladr_socr 
                 ||' ' 
                 ||k1.kladr_name 
          FROM   kladr.kladr_tmp k1 
          WHERE  k1.kladr_region = k.kladr_region 
                 AND k1.kladr_rayon = k.kladr_rayon 
                 AND k1.kladr_city = k.kladr_city 
                 AND k1.kladr_city <> '000' 
                 AND k1.kladr_nas_punkt = '000' 
                 AND k1.kladr_mod = '00') 
       ||' ' 
       ||(SELECT k1.kladr_socr 
                 ||' ' 
                 ||k1.kladr_name 
          FROM   kladr.kladr_tmp k1 
          WHERE  k1.kladr_region = k.kladr_region 
                 AND k1.kladr_rayon = k.kladr_rayon 
                 AND k1.kladr_city = k.kladr_city 
                 AND k1.kladr_nas_punkt = k.kladr_nas_punkt 
                 AND k1.kladr_nas_punkt <> '000' 
                 AND k1.kladr_mod = '00')kladr_full_name 
FROM   kladr.kladr_tmp k 
WHERE  k.kladr_mod = '00' 

DB postgreSql. jpa prov 休止状態。この理由は何でしょうか?

いくつかのサブクエリが null を返す場合、このクエリを postgres (oracle db で動作する前に) で動作するように変更する方法を質問します。

4

1 に答える 1

3

PostgreSQL では、フォームの式は、その引数のいずれかが である場合a || bに評価されます。したがって、これらのサブクエリのいずれかがレコードを見つけられない場合、ステートメントは挿入を試みます。これらの各サブクエリを個別に試して、どのサブクエリがレコードを提供していないか (または を含むレコードを提供しているか) を確認する必要があります。NULLNULLINSERTNULLkladr_full_nameNULL


OP コメントに応じて追加するように編集: Oracle では、長さがゼロの文字列は変換されるため、長さ 0 の文字列の概念はありませんNULL(たとえば、'' = ''は true ではありませんが、そう'' IS NULLです)。通常、変換は一方向 — — ですが、演算子LENGTH('') IS NULLの場合は、isのような長さ 0 の文字列に変換されます。PostgreSQL はと区別するため、この変換を自動的に行いませんが次のいずれかを実行できます。||NULL'ab' || NULL || 'cd''abcd'''NULL

于 2012-10-18T14:07:00.840 に答える