표준 SQL의 연산자

연산자는 특수문자나 키워드로 표현되며 함수 호출 구문을 사용하지 않습니다. 연산자는 피연산자라고도 불리는 임의 수의 데이터 입력을 조작하여 결과를 반환합니다.

일반 규칙:

  • 달리 명시되지 않는 한, 피연산자 중 하나가 NULL이면 모든 연산자가 NULL을 반환합니다.
  • 계산 결과가 오버플로인 경우 모든 연산자에서 오류가 발생합니다.
  • 모든 부동 소수점 연산의 경우 +/-infNaN은 피연산자 중 하나가 +/-inf 또는 NaN일 때만 반환될 수 있습니다. 그 외의 경우에는 오류가 반환됩니다.

아래 표에서는 모든 BigQuery 연산자를 우선순위(즉, 문 내에서 평가되는 순서)대로 나열합니다.

우선순위 연산자 입력 데이터 유형 이름 연산자 항
1 . STRUCT
멤버 필드 액세스 연산자 이항
  [ ] ARRAY 배열 위치. OFFSET 또는 ORDINAL과 함께 사용해야 함. ARRAY 함수 참조. 이항
2 - 모든 숫자 유형 단항 뺄셈 단항
  ~ 정수 또는 BYTES 비트 NOT 단항
3 * 모든 숫자 유형 곱셈 이항
  / 모든 숫자 유형 나눗셈 이항
4 + 모든 숫자 유형 덧셈 이항
  - 모든 숫자 유형 뺄셈 이항
5 << 정수 또는 BYTES 비트 왼쪽 시프트 이항
  >> 정수 또는 BYTES 비트 오른쪽 시프트 이항
6 & 정수 또는 BYTES 비트 AND 이항
7 ^ 정수 또는 BYTES 비트 XOR 이항
8 | 정수 또는 BYTES 비트 OR 이항
9(비교 연산자) = 비교 가능한 모든 유형. 전체 목록은 데이터 유형을 참조하세요. 같음 이항
  < 비교 가능한 모든 유형. 전체 목록은 데이터 유형을 참조하세요. 미만 이항
  > 비교 가능한 모든 유형. 전체 목록은 데이터 유형을 참조하세요. 초과 이항
  <= 비교 가능한 모든 유형. 전체 목록은 데이터 유형을 참조하세요. 이하 이항
  >= 비교 가능한 모든 유형. 전체 목록은 데이터 유형을 참조하세요. 이상 이항
  !=, <> 비교 가능한 모든 유형. 전체 목록은 데이터 유형을 참조하세요. 같지 않음 이항
  [NOT] LIKE STRING 및 바이트 지정한 패턴과 일치하지 [않는] 값 이항
  [NOT] BETWEEN 비교 가능한 모든 유형. 목록은 데이터 유형 참조. 지정한 범위 내에 있지 [않은] 값 이항
  [NOT] IN 비교 가능한 모든 유형. 목록은 데이터 유형 참조. 지정한 값의 집합에 있지 [않은] 값 이항
  IS [NOT] NULL 전체 값이 NULL이 [아님] 단항
  IS [NOT] TRUE BOOL 값이 TRUE가 [아님]. 단항
  IS [NOT] FALSE BOOL 값이 FALSE가 [아님]. 단항
10 NOT BOOL 논리 부정 단항
11 AND BOOL 논리곱 이항
12 또는 BOOL 논리합 이항

우선순위가 같은 연산자는 결합된 상태로 유지됩니다. 즉, 이러한 연산자는 그룹화되어 왼쪽에서 시작해서 오른쪽으로 이동합니다. 예를 들어 표현식은 다음과 같습니다.

x AND y AND z

위 표현식의 해석 결과는 다음과 같습니다.

( ( x AND y ) AND z )

그리고

x * y / z

위 표현식의 해석 결과는 다음과 같습니다.

( ( x * y ) / z )

모든 비교 연산자는 우선순위가 동일하지만 서로 결합되지 않습니다. 따라서 모호하지 않도록 괄호를 사용해야 합니다. 예를 들면 다음과 같습니다.

(x < y) IS FALSE

요소 액세스 연산자

연산자 구문 입력 데이터 유형 결과 데이터 유형 설명
. expression.fieldname1... STRUCT
fieldname1에 저장된 유형 T 점 연산자입니다. 중첩 필드에 액세스하는 데 사용할 수 있습니다(예: e.g.expression.fieldname1.fieldname2...).
[ ] array_expression [position_keyword (int_expression ) ] ARRAY 함수를 참조하세요. ARRAY에 저장된 유형 T position_keyword는 OFFSET 또는 ORDINAL입니다. 이 연산자를 사용하는 두 함수에 대해서는 ARRAY 함수를 참조하세요.

산술 연산자

모든 산술 연산자는 숫자 유형 T의 입력을 허용하며 결과 유형은 아래의 설명에서 달리 명시하지 않는 한 유형 T에 해당합니다.

이름 구문
덧셈 X + Y
뺄셈 X - Y
곱셈 X * Y
나눗셈 X / Y
단항 뺄셈 - X

참고: 0으로 나누는 연산은 오류를 반환합니다. 다른 결과를 반환하려면 IEEE_DIVIDE 또는 SAFE_DIVIDE 함수를 사용해 보세요.

덧셈과 곱셈의 결과 유형:

 INT64NUMERICFLOAT64
INT64INT64NUMERICFLOAT64
NUMERICNUMERICNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64

뺄셈의 결과 유형:

 INT64NUMERICFLOAT64
INT64INT64NUMERICFLOAT64
NUMERICNUMERICNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64

나눗셈의 결과 유형:

 INT64NUMERICFLOAT64
INT64FLOAT64NUMERICFLOAT64
NUMERICNUMERICNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64

단항 뺄셈의 결과 유형:

입력 데이터 유형 결과 데이터 유형
INT64 INT64
NUMERIC NUMERIC
FLOAT64 FLOAT64

비트 연산자

모든 비트 연산자는 첫 번째 피연산자와 동일한 유형과 동일한 길이를 반환합니다.

이름 구문 입력 데이터 유형 설명
비트 NOT ~ X 정수 또는 BYTES 각 비트에 대해 논리 부정을 수행하며 주어진 2진수 값의 여집합을 형성합니다.
비트 OR X | Y X: 정수 또는 BYTES
Y: X와 동일한 유형
길이가 같은 2개의 비트 패턴을 취하며 해당 비트의 각 쌍에서 포괄적 논리합 연산을 수행합니다. 이 연산자는 X와 Y의 BYTES 길이가 다른 경우 오류를 생성합니다.
비트 XOR X ^ Y X: 정수 또는 BYTES
Y: X와 동일한 유형
길이가 같은 2개의 비트 패턴을 취하며 해당 비트의 각 쌍에서 배타적 논리합 연산을 수행합니다. 이 연산자는 X와 Y의 BYTES 길이가 다른 경우 오류를 생성합니다.
비트 AND X & Y X: 정수 또는 BYTES
Y: X와 동일한 유형
길이가 같은 2개의 비트 패턴을 취하며 해당 비트의 각 쌍에서 논리곱 연산을 수행합니다. 이 연산자는 X와 Y의 BYTES 길이가 다른 경우 오류를 생성합니다.
왼쪽 시프트 X << Y X: 정수 또는 BYTES
Y: INT64
첫 번째 연산자 X를 왼쪽으로 옮깁니다. 이 연산자는 두 번째 연산자 Y가 첫 번째 연산자 X의 비트 길이보다 크거나 같으면 0 또는 바이트 시퀀스 b'\x00'을 반환합니다(예: X에 유형 INT64가 있으면 64). 이 연산자는 Y가 음수이면 오류를 생성합니다.
오른쪽 시프트 X >> Y X: 정수 또는 BYTES
Y: INT64
첫 번째 피연산자 X를 오른쪽으로 옮깁니다. 이 연산자는 부호가 있는 유형으로 부호 비트 확장을 수행하지 않습니다(즉, 왼쪽에 비어 있는 비트를 0으로 채움). 이 연산자는 두 번째 연산자 Y가 첫 번째 연산자 X의 비트 길이보다 크거나 같으면 0 또는 바이트 시퀀스 b'\x00'을 반환합니다(예: X에 유형 INT64가 있으면 64). 이 연산자는 Y가 음수이면 오류를 생성합니다.

논리 연산자

모든 논리 연산자는 BOOL 입력만 허용합니다.

이름 구문 설명
논리 부정 NOT X 입력이 TRUE이면 FALSE를 반환합니다. 입력이 FALSE이면 TRUE를 반환합니다. 그 밖의 경우에는 NULL을 반환합니다.
논리곱 X AND Y 적어도 하나의 입력이 FALSE이면 FALSE를 반환합니다. X와 Y가 모두 TRUE이면 TRUE를 반환합니다. 그 밖의 경우에는 NULL을 반환합니다.
논리합 X OR Y X와 Y가 모두 FALSE이면 FALSE를 반환합니다. 적어도 하나의 입력이 TRUE이면 TRUE를 반환합니다. 그 밖의 경우에는 NULL을 반환합니다.

비교 연산자

비교는 항상 BOOL을 반환합니다. 비교를 하려면 일반적으로 두 피연산자가 동일한 유형이어야 합니다. 피연산자 유형이 다르고 BigQuery가 정밀도를 유지하면서 해당 유형의 값을 공통된 유형으로 변환할 수 있는 경우, 일반적으로 BigQuery는 비교를 위해 공통된 유형으로 값을 강제합니다. BigQuery는 일반적으로 리터럴을 비 리터럴 유형으로 강제합니다(존재하는 경우). 비교할 수 있는 데이터 유형은 데이터 유형에 정의되어 있습니다.

STRUCT는 같음(=), 같지 않음(!= 및 <>), IN과 같은 4가지 비교 연산자만 지원합니다.

이러한 데이터 유형을 비교할 때는 다음 규칙이 적용됩니다.

  • FLOAT64: NaN이 포함된 모든 비교는 FALSE를 반환합니다. 단, !=<>은 TRUE를 반환합니다.
  • BOOL: FALSE가 TRUE보다 작습니다.
  • STRING: 코드 포인트별로 문자열을 비교합니다. 즉, 규범적 등가 문자열은 먼저 정규화된 경우에 한해 비교 결과가 같음으로 보장됩니다.
  • NULL: 이 경우에는 입력이 NULL인 모든 연산은 NULL을 반환한다는 규칙이 적용됩니다.
이름 구문 설명
미만 X < Y X가 Y보다 작으면 TRUE를 반환합니다.
이하 X <= Y X가 Y보다 작거나 같으면 TRUE를 반환합니다.
초과 X > Y X가 Y보다 크면 TRUE를 반환합니다.
이상 X >= Y X가 Y보다 크거나 같으면 TRUE를 반환합니다.
같음 X = Y X가 Y와 같으면 TRUE를 반환합니다.
같지 않음 X != Y
X <> Y
X가 Y와 같지 않으면 TRUE를 반환합니다.
BETWEEN X [NOT] BETWEEN Y AND Z X가 지정한 범위 내에 있지 [않으면] TRUE를 반환합니다. 'X BETWEEN Y AND Z'의 결과는 'Y <= X AND X <= Z'와 같지만, 전자의 경우 X가 한 번만 평가됩니다.
LIKE X [NOT] LIKE Y 첫 번째 피연산자 X의 STRING이 두 번째 피연산자 Y가 지정한 패턴과 일치하는지 확인합니다. 표현식에 다음과 같은 문자를 포함할 수 있습니다.
  • 퍼센트 기호 '%'는 임의의 수의 문자나 바이트와 일치합니다.
  • 밑줄 '_'은 하나의 문자나 바이트와 일치합니다.
  • 백슬래시 2개를 사용하여 '\', '_', '%'를 이스케이프 처리할 수 있습니다. 예: "\\%". 원시 문자열을 사용할 경우, 백슬래시가 하나만 필요합니다. 예: r"\%".
IN 다양함 - 아래 참조 오른쪽 피연산자가 비어 있으면 FALSE를 반환합니다. 왼쪽 피연산자가 NULL이면 NULL을 반환합니다. 오른쪽 피연산자에 NULL이 포함되어 있으면 TRUE 또는 NULL을 반환하고, 절대 FALSE를 반환하지 않습니다. IN의 양쪽에 있는 인수는 일반적인 표현식입니다. 어느 쪽 피연산자도 리터럴일 필요는 없지만 오른쪽에 리터럴을 사용하는 것이 가장 일반적입니다. X는 한 번만 평가됩니다.

STRUCT 데이터 유형의 값이 서로 같은지 테스트할 때, 하나 이상의 필드가 NULL인 경우가 있습니다. 이 경우,

  • NULL이 아닌 모든 필드 값이 같다면 비교 후 NULL이 반환됩니다.
  • NULL이 아닌 필드 값이 같지 않다면 비교 후 false가 반환됩니다.

아래 표는 NULL 값의 필드를 가진 STRUCT 데이터 유형이 어떻게 비교되는지 보여줍니다.

Struct1 Struct2 Struct1 = Struct2
STRUCT(1, NULL) STRUCT(1, NULL) NULL
STRUCT(1, NULL) STRUCT(2, NULL) FALSE
STRUCT(1,2) STRUCT(1, NULL) NULL

IN 연산자

IN 연산자는 다음과 같은 구문을 지원합니다.

x [NOT] IN (y, z, ... ) # Requires at least one element
x [NOT] IN (<subquery>)
x [NOT] IN UNNEST(<array expression>) # analysis error if the expression
                                      # does not return an ARRAY type.

IN 연산자 양쪽의 인수는 일반적인 표현식입니다. 오른쪽 표현식에 리터럴을 사용하는 것이 일반적이지만 필수는 아닙니다.

다음 표현식의 의미 체계는

x IN (y, z, ...)

다음과 동일한 것으로 정의되며

(x = y) OR (x = z) OR ...

서브 쿼리와 배열 형식은 유사하게 정의됩니다.

x NOT IN ...

다음과 동일합니다.

NOT(x IN ...)

UNNEST 형식은 배열 스캔을 FROM 절의 UNNEST처럼 취급합니다.

x [NOT] IN UNNEST(<array expression>)

이 형식은 종종 ARRAY 매개변수와 함께 사용됩니다. 예를 들면 다음과 같습니다.

x IN UNNEST(@array_parameter)

참고: NULL ARRAY는 빈 ARRAY와 동일하게 취급됩니다.

이 구문을 사용하는 방법에 대한 자세한 내용은 배열 항목을 참조하세요.

IN 연산자를 사용할 때는 다음과 같은 의미 체계가 적용됩니다.

  • 오른쪽의 표현식이 비어 있는 IN은 항상 FALSE입니다.
  • 왼쪽 표현식이 NULL이고 오른쪽 표현식이 비어 있지 않은 IN은 항상 NULL입니다.
  • IN 목록에 NULL이 있는 IN은 TRUE 또는 NULL만 반환할 수 있으며, 절대 FALSE를 반환하지 않습니다.
  • NULL IN (NULL)NULL을 반환합니다.
  • IN UNNEST(<NULL array>)는 FALSE를 반환합니다(NULL 아님).
  • IN 목록에 NULL이 있는 NOT IN은 FALSE 또는 NULL만 반환할 수 있으며, 절대 TRUE를 반환하지 않습니다.

구조체 생성자 구문을 사용하여 IN을 멀티 파트 키와 함께 사용할 수 있습니다. 예를 들면 다음과 같습니다.

(Key1, Key2) IN ( (12,34), (56,78) )
(Key1, Key2) IN ( SELECT (table.a, table.b) FROM table )

이 구문에 대한 자세한 내용은 데이터 유형 항목의 구조체 유형 섹션을 참조하세요.

IS 연산자

IS 연산자는 테스트하는 조건에 대해 TRUE 또는 FALSE를 반환합니다. 이 연산자는 수학 함수에 정의된 IS_INF 및 IS_NAN 함수와 달리 입력이 NULL이어도 절대로 NULL을 반환하지 않습니다. NOT이 존재할 경우, 출력 BOOL 값이 반전됩니다.

함수 구문 입력 데이터 유형 결과 데이터 유형 설명

X IS [NOT] NULL
모든 값 유형 BOOL 피연산자 X가 NULL로 평가될 경우 TRUE를 반환하고, 그렇지 않은 경우 FALSE를 반환합니다.

X IS [NOT] TRUE
BOOL BOOL BOOL 피연산자가 TRUE로 평가될 경우 TRUE를 반환하고 그렇지 않은 경우 FALSE를 반환합니다.

X IS [NOT] FALSE
BOOL BOOL BOOL 피연산자가 FALSE로 평가될 경우 TRUE를 반환하고 그렇지 않은 경우 FALSE를 반환합니다.
이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.