BITAND

BITAND (비트 AND)

두 숫자 또는 이진 표현식의 비트 AND를 반환해요.

별칭: BIT_AND

참조: BITAND_AGG

출처: Snowflake SQL Reference - BITAND

본문

구문

BITAND( <expr1>, <expr2> [, '<padside>' ] )

인자

expr1

이 표현식은 INTEGER 값, BINARY 값, 또는 INTEGER 값으로 캐스트할 수 있는 데이터 타입의 값으로 평가되어야 해요.

expr2

이 표현식은 INTEGER 값, BINARY 값, 또는 INTEGER 값으로 캐스트할 수 있는 데이터 타입의 값으로 평가되어야 해요.

''

두 BINARY 인자 값의 길이가 같지 않을 때, 더 짧은 길이의 값을 어느 쪽에 패딩할지 지정해요. 다음 대소문자 구분 없는 값 중 하나를 지정해요:

  • LEFT — 값을 왼쪽에 패딩해요.
  • RIGHT — 값을 오른쪽에 패딩해요.

더 짧은 값은 더 큰 값의 길이와 같아지도록 0으로 패딩돼요.

이 인자는 BINARY 표현식이 지정된 경우에만 유효해요.

두 BINARY 값의 길이가 다르면 이 인자가 필요해요.

반환 값

INTEGER 값, BINARY 값, 또는 NULL을 반환해요:

  • 입력 표현식이 INTEGER 값을 포함하면 입력 표현식의 비트 AND를 나타내는 INTEGER 값을 반환해요.
  • 입력 표현식이 BINARY 값을 포함하면 입력 표현식의 비트 AND를 나타내는 BINARY 값을 반환해요.
  • 두 입력 값 중 하나가 NULL이면 NULL을 반환해요.

사용상 주의사항

  • 두 입력 표현식은 INTEGER 또는 BINARY 중 같은 데이터 타입의 값으로 평가되어야 해요.
  • 어느 인자의 데이터 타입이 숫자지만 INTEGER가 아니면(예: FLOAT, DECIMAL 등), 인자는 INTEGER 값으로 캐스트돼요.
  • 어느 인자의 데이터 타입이 문자열이면(예: VARCHAR), 가능하면 인자는 INTEGER 값으로 캐스트돼요. 예를 들어 문자열 12.3은 12로 캐스트돼요. 값이 INTEGER 값으로 캐스트될 수 없으면 값은 NULL로 처리돼요.
  • 함수는 인자를 BINARY 값으로 암시적으로 캐스트하지 않아요.

예시

다음 섹션들은 INTEGER 인자 값과 BINARY 인자 값에 대한 예시를 포함해요.

INTEGER 인자 값과 함께 BITAND, BITOR, BITXOR 사용

간단한 테이블을 만들고 데이터를 삽입해요:

CREATE OR REPLACE TABLE bits (ID INTEGER, bit1 INTEGER, bit2 INTEGER);
INSERT INTO bits (ID, bit1, bit2) VALUES
  (11,    1,     1),    -- Bits are all the same.
  (24,    2,     4),    -- Bits are all different.
  (42,    4,     2),    -- Bits are all different.
  (1624,  16,    24),   -- Bits overlap.
  (65504, 0,     65504),-- Lots of bits (all but the low 6 bits).
  (0,     NULL,  NULL)  -- No bits.
  ;

쿼리 실행:

SELECT bit1,
       bit2,
       BITAND(bit1, bit2),
       BITOR(bit1, bit2),
       BITXOR(bit1, BIT2)
  FROM bits
  ORDER BY bit1;
+------+-------+--------------------+-------------------+--------------------+
| BIT1 |  BIT2 | BITAND(BIT1, BIT2) | BITOR(BIT1, BIT2) | BITXOR(BIT1, BIT2) |
|------+-------+--------------------+-------------------+--------------------|
|    0 | 65504 |                  0 |             65504 |              65504 |
|    1 |     1 |                  1 |                 1 |                  0 |
|    2 |     4 |                  0 |                 6 |                  6 |
|    4 |     2 |                  0 |                 6 |                  6 |
|   16 |    24 |                 16 |                24 |                  8 |
| NULL |  NULL |               NULL |              NULL |               NULL |
+------+-------+--------------------+-------------------+--------------------+

BINARY 인자 값과 함께 BITAND, BITOR, BITXOR 사용

간단한 테이블을 만들고 데이터를 삽입해요:

CREATE OR REPLACE TABLE bits (ID INTEGER, bit1 BINARY(2), bit2 BINARY(2), bit3 BINARY(4));

INSERT INTO bits VALUES
  (1, x'1010', x'0101', x'11001010'),
  (2, x'1100', x'0011', x'01011010'),
  (3, x'BCBC', x'EEFF', x'ABCDABCD'),
  (4, NULL, NULL, NULL);

참고: BINARY 값은 x'value' 표기법을 사용해 삽입되는데, 여기서 value는 16진수 자릿수를 포함해요. 자세한 내용은 Binary input and output을 참고해요.

같은 길이의 BINARY 열에 쿼리 실행:

SELECT bit1,
       bit2,
       BITAND(bit1, bit2),
       BITOR(bit1, bit2),
       BITXOR(bit1, bit2)
  FROM bits;
+------+------+--------------------+-------------------+--------------------+
| BIT1 | BIT2 | BITAND(BIT1, BIT2) | BITOR(BIT1, BIT2) | BITXOR(BIT1, BIT2) |
|------+------+--------------------+-------------------+--------------------|
| 1010 | 0101 | 0000               | 1111              | 1111               |
| 1100 | 0011 | 0000               | 1111              | 1111               |
| BCBC | EEFF | ACBC               | FEFF              | 5243               |
| NULL | NULL | NULL               | NULL              | NULL               |
+------+------+--------------------+-------------------+--------------------+

'padside' 인자 없이 다른 길이의 BINARY 열에 쿼리를 실행하려 하면 오류가 반환돼요:

SELECT bit1,
       bit3,
       BITAND(bit1, bit3),
       BITOR(bit1, bit3),
       BITXOR(bit1, bit3)
  FROM bits;
100544 (22026): The lengths of two variable-sized fields do not match: first length 2, second length 4

다른 길이의 BINARY 열에 쿼리를 실행하고, 더 작은 인자 값을 왼쪽에 패딩해요:

SELECT bit1,
       bit3,
       BITAND(bit1, bit3, 'LEFT'),
       BITOR(bit1, bit3, 'LEFT'),
       BITXOR(bit1, bit3, 'LEFT')
  FROM bits;
+------+----------+----------------------------+---------------------------+----------------------------+
| BIT1 | BIT3     | BITAND(BIT1, BIT3, 'LEFT') | BITOR(BIT1, BIT3, 'LEFT') | BITXOR(BIT1, BIT3, 'LEFT') |
|------+----------+----------------------------+---------------------------+----------------------------|
| 1010 | 11001010 | 00001010                   | 11001010                  | 11000000                   |
| 1100 | 01011010 | 00001000                   | 01011110                  | 01010110                   |
| BCBC | ABCDABCD | 0000A88C                   | ABCDBFFD                  | ABCD1771                   |
| NULL | NULL     | NULL                       | NULL                      | NULL                       |
+------+----------+----------------------------+---------------------------+----------------------------+

다른 길이의 BINARY 열에 쿼리를 실행하고, 더 작은 인자 값을 오른쪽에 패딩해요:

SELECT bit1,
       bit3,
       BITAND(bit1, bit3, 'RIGHT'),
       BITOR(bit1, bit3, 'RIGHT'),
       BITXOR(bit1, bit3, 'RIGHT')
  FROM bits;
+------+----------+-----------------------------+----------------------------+-----------------------------+
| BIT1 | BIT3     | BITAND(BIT1, BIT3, 'RIGHT') | BITOR(BIT1, BIT3, 'RIGHT') | BITXOR(BIT1, BIT3, 'RIGHT') |
|------+----------+-----------------------------+----------------------------+-----------------------------|
| 1010 | 11001010 | 10000000                    | 11101010                   | 01101010                    |
| 1100 | 01011010 | 01000000                    | 11011010                   | 10011010                    |
| BCBC | ABCDABCD | A88C0000                    | BFFDABCD                   | 1771ABCD                    |
| NULL | NULL     | NULL                        | NULL                       | NULL                        |
+------+----------+-----------------------------+----------------------------+-----------------------------+

더 알아보기