programing

뷰에 null이 아닌 열을 만드는 방법

stoneblock 2023. 9. 11. 21:25

뷰에 null이 아닌 열을 만드는 방법

다음과 같은 표가 주어집니다.

CREATE TABLE "MyTable" 
(
  "MyColumn" NUMBER NOT NULL
);

다음과 같은 보기를 작성합니다.

CREATE VIEW "MyView" AS
SELECT
    CAST("MyColumn" AS BINARY_DOUBLE) AS "MyColumn"
FROM "MyTable";

열 "MyColumn"이 "NOT NULL"인 경우에만 해당됩니다.

SQL Server에서는 다음과 같은 작업이 매우 간단합니다.

CREATE VIEW [MyView] AS
SELECT
    ISNULL(CAST([MyColumn] AS Float), 0.0) AS [MyColumn]
FROM [MyTable];

그러나 Oracle 등가물은 "NULL" 열을 생성합니다.

CREATE VIEW "MyView" AS
SELECT
    NVL(CAST("MyColumn" AS BINARY_DOUBLE), 0.0) AS "MyColumn"
FROM "MyTable";

Oracle이 메타데이터에서 보기의 열을 "NOT NULL"로 표시하도록 강제할 수 있는 방법이 있습니까?

not null 또는 체크 제약 조건을 뷰에 추가할 수 없습니다. 이 내용과 같은 페이지의 'Restrictions on NOT NULL 제약 조건' 및 'Restrictions on Check Constraints'를 참조하십시오.추가할 수 있습니다.with check option(중복된 where 절 참조) 보기에는 다음과 같이 표시되지 않습니다.not null데이터 사전에 기록되어 있습니다.

이 효과를 얻을 수 있는 유일한 방법은 11g을 사용하는 경우 캐스트 값을 테이블의 가상 열로 추가하고 (필요한 경우) 이에 대한 보기를 만드는 것입니다.

ALTER TABLE "MyTable" ADD "MyBDColumn" AS
    (CAST("MyColumn" AS BINARY_DOUBLE)) NOT NULL;

CREATE OR REPLACE VIEW "MyView" AS
SELECT
    "MyBDColumn" AS "MyColumn"
FROM "MyTable";

desc "MyView"

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 MyColumn                                  NOT NULL BINARY_DOUBLE

dba.se 의 댓글에서 이는 뭔가를 조롱하기 위한 것이라고 했으므로 일반 열과 트리거를 사용하여 가상 열을 시뮬레이션할 수 있습니다.

CREATE TABLE "MyTable" 
(
  "MyColumn" NUMBER NOT NULL,
  "MyBDColumn" BINARY_DOUBLE NOT NULL
);

CREATE TRIGGER "MyTrigger" before update or insert on "MyTable"
FOR EACH ROW
BEGIN
    :new."MyBDColumn" := :new."MyColumn";
END;
/

CREATE VIEW "MyView" AS
SELECT
    "MyBDColumn" AS "MyColumn"
FROM "MyTable";

INSERT INTO "MyTable" ("MyColumn") values (2);

SELECT * FROM "MyView";

  MyColumn
----------
  2.0E+000

그리고.desc "MyView"여전히 다음을 제공합니다.

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 MyColumn                                  NOT NULL BINARY_DOUBLE

Leigh가 언급한 바와 같이(dba.se 에서도), 보기를 삽입/업데이트하고 싶다면instead ofVC 또는 페이크 버전으로 trigger를 실행합니다.

보기 열에 NOT NULL 제약 조건을 설정할 수 있다면 해당 열이 NULL이면 보기의 SELECT가 실패할 것으로 생각합니다. 이러한 목적이라면 다음과 같이 원하는 것을 제공할 수 있습니다.

CREATE OR REPLACE VIEW some_view AS
  SELECT some_field,
         some_other_field,
         CASE
           WHEN field_of_interest IS NOT NULL
             THEN CAST(field_of_interest AS BINARY_DOUBLE)
             ELSE 1 / 0
         END AS field_of_interest_not_null
     FROM some_table;

그다지 매력적이지는 않으며, 케이스의 ELSE 분기점을 선택하면 "ORA-01476: 분할은 0과 같다"는 보기 흉한 메시지가 표시되지만, 아마도 "더 나은"으로 가는 길의 단계일 것입니다.

나누어서 즐겨요.


편집: 대상 열이 null이 아닌 행만 선택하는 것이 목표인 경우 다음과 같이 보기에 WHERE 절을 추가할 수 있습니다.

CREATE OR REPLACE VIEW some_view AS
  SELECT some_field,
         some_other_field,
         CAST(field_of_interest AS BINARY_DOUBLE) AS field_of_interest
    FROM some_table
    WHERE field_of_interest IS NOT NULL;

YMMV.


EDIT2: SQL Server 예제를 보면 열이 NULL이 아닌 것을 보장하기 위해 ISULL 함수가 사용되고 있는 것으로 보입니다. 이것이 허용되는 경우 다음을 수행할 수 있습니다.

CREATE OR REPLACE VIEW some_view AS
  SELECT some_field,
         some_other_field,
         CAST(NVL(field_of_interest, 0.0) AS BINARY_DOUBLE) AS field_of_interest
    FROM some_table
    WHERE field_of_interest IS NOT NULL;

Bullwinkle의 말을 인용하자면, "이번에는 확실히!!!" :-)

언급URL : https://stackoverflow.com/questions/11097839/how-to-create-a-not-null-column-in-a-view