SQL UDF 문제 해결

이 항목에서는 SQL UDF(사용자 정의 함수)에 대한 문제 해결 정보를 제공합니다.

이 항목의 내용:

문제 해결

마스킹 정책 에서 SQL UDF를 사용하는 경우 열의 데이터 타입, UDF, 마스킹 정책이 일치하는지 확인하십시오.

오류 메시지: Unsupported subquery type

원인

UDF에 쿼리 식이 포함된 경우, UDF는 하위 쿼리 로 작동할 수 있습니다. 하위 쿼리에 열 이름이 전달되면 이 하위 쿼리는 상관 하위 쿼리 로 작동할 수 있습니다. 상관 하위 쿼리가 상관 하위 쿼리에 대한 Snowflake 규칙을 위반하는 경우, 사용자는 Unsupported subquery type 오류 메시지를 받습니다. 아래 예는 유효하지 않은 상관 하위 쿼리, 그리고 UDF가 유효하지 않은 유사한 상관 하위 쿼리처럼 작동하는 방식을 보여줍니다.

다음과 같이 테이블 쌍을 만들고 여기에 데이터를 로딩하십시오.

CREATE TABLE stores (store_ID INTEGER, city VARCHAR);
CREATE TABLE employee_sales (employee_ID INTEGER, store_ID INTEGER, sales NUMERIC(10,2), 
    sales_date DATE);
INSERT INTO stores (store_ID, city) VALUES 
    (1, 'Winnipeg'),
    (2, 'Toronto');
INSERT INTO employee_sales (employee_ID, store_ID, sales, sales_date) VALUES 
    (1001, 1, 9000.00, '2020-01-27'),
    (1002, 1, 2000.00, '2020-01-27'),
    (2001, 2, 6000.00, '2020-01-27'),
    (2002, 2, 4000.00, '2020-01-27'),
    (2002, 2, 5000.00, '2020-01-28')
    ;
Copy

다음 SQL 문에는 Snowflake 규칙을 따르지 않는 상관 하위 쿼리가 포함되어 있습니다. 이 코드는 Unsupported subquery type 오류를 발생시킵니다.

SELECT employee_ID,
       store_ID,
       (SELECT city FROM stores WHERE stores.store_ID = employee_sales.store_ID)
    FROM employee_sales;
Copy

아래 코드는 위에 표시된 것과 유사한 상관 하위 쿼리를 만드는 방식으로 하위 쿼리와 유사한 UDF를 만들고 호출합니다.

CREATE FUNCTION subquery_like_udf(X INT)
    RETURNS VARCHAR
    LANGUAGE SQL
    AS
    $$
        SELECT city FROM stores WHERE stores.store_ID = X
    $$;
Copy
SELECT employee_ID, subquery_like_udf(employee_sales.store_ID)
    FROM employee_sales;
Copy
해결책 #1

UDF에 쿼리 식이 포함된 경우, 하위 쿼리 규칙과 일치하는 방식으로만 UDF를 호출하십시오.

예를 들어, 다음 문은 열 이름이 아닌 상수를 사용하여 UDF를 호출하므로 UDF는 상관된 하위 쿼리처럼 작동하지 않습니다.

SELECT subquery_like_udf(1);
+----------------------+
| SUBQUERY_LIKE_UDF(1) |
|----------------------|
| Winnipeg             |
+----------------------+
Copy
해결책 #2

어떤 경우에는 UDF를 다시 작성하여 동일 목표를 다른 방식으로 달성할 수 있습니다. 하나의 행을 반환하도록 하위 쿼리를 정적으로 결정할 수 있는 경우, 상관 하위 쿼리가 허용됩니다. 다음 UDF는 집계 함수를 사용하므로 하나의 행만 반환합니다.

CREATE FUNCTION subquery_like_udf_2(X INT)
    RETURNS VARCHAR
    LANGUAGE SQL
    AS
    $$
        SELECT ANY_VALUE(city) FROM stores WHERE stores.store_ID = X
    $$;
Copy
SELECT employee_ID, sales_date, subquery_like_udf_2(employee_sales.store_ID)
    FROM employee_sales
    ORDER BY employee_ID, sales_date;
+-------------+------------+----------------------------------------------+
| EMPLOYEE_ID | SALES_DATE | SUBQUERY_LIKE_UDF_2(EMPLOYEE_SALES.STORE_ID) |
|-------------+------------+----------------------------------------------|
|        1001 | 2020-01-27 | Winnipeg                                     |
|        1002 | 2020-01-27 | Winnipeg                                     |
|        2001 | 2020-01-27 | Toronto                                      |
|        2002 | 2020-01-27 | Toronto                                      |
|        2002 | 2020-01-28 | Toronto                                      |
+-------------+------------+----------------------------------------------+
Copy