뷰에 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 of
VC 또는 페이크 버전으로 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
'programing' 카테고리의 다른 글
파이썬에서 파일을 한 줄씩 읽으려면 어떻게 해야 합니까? (0) | 2023.09.11 |
---|---|
11g 클라이언트와 함께 Oracle 10g 데이터베이스에서 내보내기 (0) | 2023.09.11 |
먼저 개체 파일에 컴파일해야 하는 이유는 무엇입니까? (0) | 2023.09.11 |
자바스크립트의 단순 스로틀 (0) | 2023.09.11 |
WonderPlugin 슬라이더에서 wonderplugin.com 링크를 제거하는 방법 (0) | 2023.09.11 |