기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
비교 제어
SQL에서 리터럴 비교는 데이터 세트의 열을 쿼리에 직접 입력된 리터럴 값과 일치시킵니다. 열 비교는 동일한 테이블 내에서 또는 조인된 테이블 간에 서로 다른 두 열의 값을 일치시킵니다.
기본 동작
비교 제어는 허용 목록입니다. 를 설정한 후에는 나열하는 열allowedLiteralComparisonColumns만 리터럴 값과 비교할 수 있으며, 항상 허용되는 값과의 비교를 제외하고 나열하지 않는 모든 열은 차단됩니다. 자세한 내용은 항상 허용되는 리터럴 값 섹션을 참조하세요. column-to-column 비교에도 동일한 허용 목록 동작이 allowedColumnComparisonColumns에 적용됩니다. 한 허용 목록에 열을 추가해도 다른 허용 목록에는 추가되지 않습니다.
를 구성하지 않으면 비교 제한이 comparisonControls AWS Clean Rooms 적용되지 않습니다. 쿼리는 모든 열을 리터럴 값 또는 다른 열과 비교할 수 있습니다.
를 구성하지 comparisonControls 않지만 최소 집계 임계값을 설정하면 비교가 제한되지 않습니다. 그러나 AWS Clean Rooms 는에 나열된 열에 대한 리터럴 비교를 허용하지 않습니다identityColumns. 유일한 예외는 항상 허용되는 값과 비교하는 것입니다. 이러한 제한은 임계값 자체에서 비롯되므로 비교 제어를 구성하는지 여부에 관계없이 적용됩니다. 자세한 내용은 최소 집계 임계값 및 항상 허용되는 리터럴 값 섹션을 참조하세요.
허용되지 않는 출력 열과 comparisonControls 함께를 구성하는 경우 두 컨트롤은 독립적이며 둘 다 적용됩니다. 비교 제어는 쿼리가 비교할 수 있는 열을 제어하고, 허용되지 않는 출력 열은 쿼리 결과에 나타날 수 있는 열을 제어합니다. 비교에서 열을 허용하고 결과에서 계속 금지할 수 있습니다. 자세한 내용은 허용되지 않는 출력 열 섹션을 참조하세요.
리터럴 비교
리터럴 비교는 하드코딩된 단일 상수(예: 문자열, 숫자, 날짜, 부울 값 또는 NULL)를 기준으로 열을 평가합니다. 쿼리 실행 중에는 연산자의 오른쪽이 변경되지 않습니다. 구문 예제는 다음과 같습니다.
-
WHERE 상태 = '활성'
-
WHERE 가격 > 49.99
최소 집계 임계값를 사용하는 경우 AWS Clean Rooms 는 항상 허용되는 identityColumns 값을 제외하고 값에 대한 리터럴 비교를 허용하지 않습니다( 참조항상 허용되는 리터럴 값). 이렇게 하면 쿼리 실행기가 개별 또는 특정 사용자 집합으로 필터링된 쿼리를 제출하는 것을 방지할 수 있습니다. 소그룹 또는 개별 데이터 주체를 제거할 수 있는 낮은 카디널리티 열에서 리터럴 비교를 허용하지 마세요.
{ "comparisonControls": { "allowedLiteralComparisonColumns": [ "status", "price" ] } }
리터럴 비교를 위한 열 선택
개인 또는 소규모 그룹을 식별하지 않는 열에 대해서만 리터럴 비교를 허용합니다. 카디널리티가 낮은 열(예: age_band, 대략적인 리전 코드)에는 허용하지 마세요. 이러한 열은 구성된 identityColumns 값이 아니지만 리터럴과 비교하면 결과를 식별 가능한 작은 모집단으로 좁힐 수 있습니다. campaign_id 또는와 같이 카디널리티가 높고 식별되지 않는 차원product_sku은 더 안전한 선택입니다.
항상 허용되는 리터럴 값
AWS Clean Rooms 는 열이에 나열되지 allowedLiteralComparisonColumns 않거나에 나열되더라도 항상 허용되는 값이라는 identityColumns 다음 리터럴 값과 열을 비교할 수 있도록 쿼리를 허용합니다.
-
NULLIS NULL및IS NOT NULL조건을 포함한 -
빈 문자열(
'') -
부울 값
true및false -
,
00.0또는와 같은 숫자 형식의 숫자 0입니다-0. 문자열은 숫자'0'가 아니므로 비교 컨트롤을 따릅니다.
이러한 값은 고정되므로 쿼리 실행기는 데이터의 특정 값을 대상으로 지정하도록 변경할 수 없습니다.
이는 열을 직접 비교하거나 , CASE, IF COALESCE또는와 같은 표현식 내에서 비교할 때 적용됩니다UPPER. 열이 다른 함수 또는 산술(예: ABS(revenue) = 0 또는 revenue - 50 = 0)로 래핑된 경우 비교는 비교 컨트롤을 따릅니다.
와 같은 다른 숫자를 포함한 다른 리터럴 값과의 비교는 비교 컨트롤을 따르며1, 자격 증명 열의 경우 최소 집계 임계값 제한을 따릅니다. 최소 집계 임계값을 구성하는 경우에도 쿼리 결과의 모든 행에 적용됩니다.
예를 들어 열이에 나열되지 않은 경우에도 allowedLiteralComparisonColumns다음 각 조건이 허용됩니다.
-- Allowed: comparisons against always-allowed values WHERE user_id IS NOT NULL WHERE revenue > 0 WHERE is_active = true
열이에 나열되지 않으면 allowedLiteralComparisonColumns다음 각 조건이 차단됩니다.
-- Blocked: other literal values, or a column wrapped in a function WHERE revenue > 1 WHERE status_code = '0' WHERE ABS(revenue) = 0
예: 캠페인 열에서 리터럴 비교 허용
게시자는 모든 출력 행이 최소 100명의 개별 사용자()를 나타내도록 최소 집계 임계값으로 사용자 지정 분석 규칙을 구성합니다user_id. 광고주는이 테이블에 대해 쿼리를 실행하지만 분석을 특정 광고 캠페인으로 범위를 지정해야 합니다. 예를 들어 한 번에 하나의 캠페인에 대한 도달 범위를 측정해야 합니다.
user_id는 자격 증명 열이므로 특정 사용자 ID와 같은 리터럴과 비교할 수 없습니다. 이렇게 하면 광고주가 결과를 단일 사용자로 필터링하는 것을 방지할 수 있습니다. 그러나 campaign_id 및 event_date는 카디널리티가 높고 식별되지 않는 차원이므로 게시자는 이를에 추가하므로 allowedLiteralComparisonColumns광고주는 캠페인별로 필터링하고 분석 범위를 날짜 범위로 지정할 수 있습니다.
{ "aggregationThresholds": [ { "identityColumns": ["user_id"], "minimumIdentityCount": 100 } ], "comparisonControls": { "allowedLiteralComparisonColumns": ["campaign_id", "event_date"] } }
이전 구성을 고려할 때이 쿼리는 허용됩니다.
-- Allowed: campaign_id and event_date are both in allowedLiteralComparisonColumns SELECT campaign_id, COUNT(DISTINCT user_id) AS reach FROM impressions WHERE campaign_id = 'CMP-1024' AND event_date >= '2026-01-01' GROUP BY campaign_id;
동일한 구성을 고려할 때이 쿼리는 차단됩니다.
-- Blocked: user_id is the identity column and can't be compared to a specific user ID SELECT campaign_id, COUNT(DISTINCT user_id) AS reach FROM impressions WHERE user_id = 'U-88231' GROUP BY campaign_id;
첫 번째 쿼리는 여전히 최소 100명의 개별 사용자가 지원하는 행만 반환하는 반면, 리터럴 비교는 campaign_id 고려되는 행을 event_date 필터링합니다. 두 번째 쿼리는 개별 데이터 주체를 제거하려고 시도하기 때문에 거부됩니다.
열 비교
열 비교는 모든 단일 행에 대해 한 열의 값을 다른 열의 값과 동적으로 평가합니다. 구문 예제는 다음과 같습니다.
-
WHERE retail_price < wholesale_price
-
WHERE users.id = order.user_id
최소 집계 임계값를 사용할 때 데이터 공급자는 대상 중복 보고서와 같이 테이블 간에 조인해야 하는 사용 사례의 identityColumns 값에 대한 열 비교를 허용할 수 있습니다.
{ "comparisonControls": { "allowedColumnComparisonColumns": [ "user_id" ] } }
예: 중복 보고서의 자격 증명 열에 대한 열 비교 허용
게시자와 광고주는 개별 사용자가 누구인지 어느 당사자도 학습하지 않고 두 데이터 세트에 표시되는 사용자 수와 같은 대상 중복을 측정하려고 합니다. 이를 위해서는 column-to-column 비교user_id인에서 두 테이블을 조인해야 합니다. 게시자를 통해 광고주는 특정 캠페인 IDs.
이 자격 증명 열이기 때문에 AWS Clean Rooms user_id는 이미 이를 사용자 ID와 같은 특정 값과 비교하는 것을 차단합니다. 이렇게 하면 한 사람에게 직접 필터링하는 것을 방지할 수 있습니다. 테이블 간 조인을 활성화하기 위해 게시자는에 user_id를 추가합니다allowedColumnComparisonColumns. 캠페인 필터링을 활성화하기 위해 게시자는에 campaign_id를 추가합니다allowedLiteralComparisonColumns.
{ "aggregationThresholds": [ { "identityColumns": ["user_id"], "minimumIdentityCount": 100 } ], "comparisonControls": { "allowedLiteralComparisonColumns": ["campaign_id"], "allowedColumnComparisonColumns": ["user_id"] } }
이전 구성을 고려할 때이 쿼리는 허용됩니다.
-- Allowed: user_id is compared against another column (column-to-column join) SELECT COUNT(DISTINCT p.user_id) AS overlapping_users FROM publisher_audience p JOIN advertiser_audience a ON p.user_id = a.user_id;
동일한 구성을 고려할 때이 쿼리는 차단됩니다.
-- Blocked: email is not in allowedColumnComparisonColumns SELECT COUNT(DISTINCT p.user_id) AS overlapping_users FROM publisher_audience p JOIN advertiser_audience a ON p.email = a.email;
column-to-column 비교는 행별로 동적으로 평가되고 쿼리 실행기가 알려진 값을 대상으로 지정하지 않기 때문에 조인이 성공합니다. 결과는 최소 집계 임계값을 적용하여 중첩 수가 최소 100명의 개별 사용자를 나타내는 경우에만 반환되도록 합니다. 가 allowedColumnComparisonColumns 허용 목록에 없고 비교에 사용할 수 없으므로 두 번째 쿼리email는 차단됩니다. 만 사용할 user_id 수 있습니다.
비교 제어 및 표현식
비교 제어는 직접 WHERE column = 'literal' 조건자뿐만 아니라 간접 리터럴 비교를 따릅니다. 를 통해 집계 함수 ANY_EXPRESSION 내부를 허용하는 경우 allowedAggregateExpressionType비교 제어는에 없는 열에 대한 리터럴 비교를 여전히 차단합니다allowedLiteralComparisonColumns. 이는 리터럴이 표현식 내에 중첩된 경우에도 적용됩니다. AWS Clean Rooms 은 CASE, COALESCE, IF, 등의 표현식 내에서 항상 허용되는 값과 비교할 수 있습니다UPPER. 예를 들어 SUM(CASE WHEN bonus = 0 THEN salary ELSE 0 END)는 허용됩니다. 자세한 내용은 항상 허용되는 리터럴 값 섹션을 참조하세요.
다음 예제는 리터럴이 직접 조건자로 작성zip_code되지 않고 CASE 표현식 내에 있더라도가 허용 목록에 없기 때문에 차단된 상태로 유지되는 쿼리를 보여줍니다.
-- Blocked: zip_code is not in allowedLiteralComparisonColumns, -- even though the literal comparison is nested inside a CASE expression SELECT SUM(CASE WHEN zip_code = '00001' THEN salary ELSE 0 END) AS total FROM employees;
이것이 두 컨트롤이 보완적인 이유입니다. 집계 내에서 표현식을 허용하면 쿼리가 계산할 수 있는 범위가 넓어지는 반면 비교 컨트롤은 쿼리가 값별로 구분할 수 있는 열을 여전히 제한합니다. 자세한 내용은 집계 함수에서 중첩 표현식 허용 섹션을 참조하세요.