์นดํ…Œ๊ณ ๋ฆฌ:

๋ฐ˜์ •ํ˜• ๋ฐ ์ •ํ˜• ๋ฐ์ดํ„ฐ ํ•จ์ˆ˜ (๋ฐฐ์—ด/์˜ค๋ธŒ์ ํŠธ)

ARRAY_INTERSECTIONยถ

๋‘ ๊ฐœ์˜ ์ž…๋ ฅ ๋ฐฐ์—ด์—์„œ ์ผ์น˜ํ•˜๋Š” ์š”์†Œ๊ฐ€ ํฌํ•จ๋œ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜๋Š” NULL์— ๋Œ€ํ•ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, NULL์„ ๊ฐ™์Œ์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ์•Œ๋ ค์ง„ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  ํ•ญ๋ชฉ:

ARRAY_EXCEPT , ARRAYS_OVERLAP

๊ตฌ๋ฌธยถ

ARRAY_INTERSECTION( <array1> , <array2> )
Copy

์ธ์žยถ

array1

๋น„๊ตํ•  ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.

array2

๋น„๊ตํ•  ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜ยถ

์ด ํ•จ์ˆ˜๋Š” ์ผ์น˜ํ•˜๋Š” ์ž…๋ ฅ ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ARRAY ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฒน์น˜๋Š” ์š”์†Œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ํ•จ์ˆ˜๋Š” ๋นˆ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋‚˜ ๋˜๋Š” ๋‘ ์ธ์ž๊ฐ€ ๋ชจ๋‘ NULL์ธ ๊ฒฝ์šฐ, ํ•จ์ˆ˜๋Š” NULL์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๋œ ๋ฐฐ์—ด ๋‚ด ๊ฐ’์˜ ์ˆœ์„œ๋Š” ์ง€์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ• ๋…ธํŠธยถ

  • OBJECT ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•  ๋•Œ, ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๋ ค๋ฉด ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด ํ•ญ๋ชฉ์— ์žˆ๋Š” ์˜ˆ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • ARRAY_INTERSECTION ๋ฐ ๊ด€๋ จ ARRAYS_OVERLAP ํ•จ์ˆ˜ ์‚ฌ์ด์˜ ์ฐจ์ด์ ์€ ARRAYS_OVERLAP ํ•จ์ˆ˜๋Š” ๋‹จ์ˆœํžˆ TRUE ๋˜๋Š” FALSE ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ˜๋ฉด, ARRAY_INTERSECTION ์€ ์‹ค์ œ ์ค‘์ฒฉ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • Snowflake์—์„œ ๋ฐฐ์—ด์€ ์„ธํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค์ค‘ ์„ธํŠธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋ฐฐ์—ด์—๋Š” ๋™์ผํ•œ ๊ฐ’์˜ ์—ฌ๋Ÿฌ ๋ณต์‚ฌ๋ณธ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ARRAY_INTERSECTION ์€ ๋‹ค์ค‘ ์„ธํŠธ ์˜๋ฏธ ์ฒด๊ณ„(๋•Œ๋กœ๋Š” โ€œ๋ชจ์Œ ์˜๋ฏธ ์ฒด๊ณ„โ€๋ผ๊ณ ๋„ ํ•จ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•จ์ˆ˜๊ฐ€ ๋™์ผ ๊ฐ’์˜ ์—ฌ๋Ÿฌ ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฐฐ์—ด์— ๊ฐ’์˜ ๋ณต์‚ฌ๋ณธ์ด N๊ฐœ ์žˆ๊ณ , ๋‹ค๋ฅธ ๋ฐฐ์—ด์—๋Š” ๋™์ผ ๊ฐ’์˜ ๋ณต์‚ฌ๋ณธ์ด M๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋ฐ˜ํ™˜๋œ ๋ฐฐ์—ด์˜ ๋ณต์‚ฌ๋ณธ ์ˆ˜๋Š” N ๋˜๋Š” M ์ค‘ ์ž‘์€ ์ˆ˜์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, N์ด 4์ด๊ณ  M์ด 2์ธ ๊ฒฝ์šฐ, ๋ฐ˜ํ™˜๋œ ๊ฐ’์—๋Š” 2๊ฐœ์˜ ๋ณต์‚ฌ๋ณธ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ์ •ํ˜• ARRAY๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ:

    • ํ•จ์ˆ˜๋Š” ๋‘ ์ž…๋ ฅ ์œ ํ˜•์„ ๋ชจ๋‘ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜•์˜ ARRAY๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    • ๋‘ ๋ฒˆ์งธ ์ธ์ž์˜ ARRAY๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ž์˜ ARRAY์™€ ๋น„๊ต ๊ฐ€๋Šฅ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆยถ

์ด ์˜ˆ๋Š” ํ•จ์ˆ˜์˜ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

SELECT array_intersection(ARRAY_CONSTRUCT('A', 'B'), 
                          ARRAY_CONSTRUCT('B', 'C'));
+------------------------------------------------------+
| ARRAY_INTERSECTION(ARRAY_CONSTRUCT('A', 'B'),        |
|                           ARRAY_CONSTRUCT('B', 'C')) |
|------------------------------------------------------|
| [                                                    |
|   "B"                                                |
| ]                                                    |
+------------------------------------------------------+
Copy

์„ธํŠธ์—๋Š” ์ผ์น˜ํ•˜๋Š” ๊ฐ’์ด ๋‘ ๊ฐœ ์ด์ƒ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT array_intersection(ARRAY_CONSTRUCT('A', 'B', 'C'), 
                          ARRAY_CONSTRUCT('B', 'C'));
+------------------------------------------------------+
| ARRAY_INTERSECTION(ARRAY_CONSTRUCT('A', 'B', 'C'),   |
|                           ARRAY_CONSTRUCT('B', 'C')) |
|------------------------------------------------------|
| [                                                    |
|   "B",                                               |
|   "C"                                                |
| ]                                                    |
+------------------------------------------------------+
Copy

๋™์ผํ•œ ์ผ์น˜ ๊ฐ’์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ์ฟผ๋ฆฌ์—์„œ ํ•œ ๋ฐฐ์—ด์—๋Š” ๋ฌธ์ž โ€˜Bโ€™์˜ ๋ณต์‚ฌ๋ณธ์ด ์„ธ ๊ฐœ ์žˆ๊ณ , ๋‹ค๋ฅธ ๋ฐฐ์—ด์—๋Š” ๋ฌธ์ž โ€˜Bโ€™์˜ ๋ณต์‚ฌ๋ณธ์ด ๋‘ ๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์—๋Š” ๋‘ ๊ฐœ์˜ ์ผ์น˜ ํ•ญ๋ชฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

SELECT array_intersection(ARRAY_CONSTRUCT('A', 'B', 'B', 'B', 'C'), 
                          ARRAY_CONSTRUCT('B', 'B'));
+---------------------------------------------------------------+
| ARRAY_INTERSECTION(ARRAY_CONSTRUCT('A', 'B', 'B', 'B', 'C'),  |
|                           ARRAY_CONSTRUCT('B', 'B'))          |
|---------------------------------------------------------------|
| [                                                             |
|   "B",                                                        |
|   "B"                                                         |
| ]                                                             |
+---------------------------------------------------------------+
Copy

์ด ์˜ˆ๋Š” ๋” ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

CREATE OR REPLACE TABLE array_demo (ID INTEGER, array1 ARRAY, array2 ARRAY, tip VARCHAR);

INSERT INTO array_demo (ID, array1, array2, tip)
    SELECT 1, ARRAY_CONSTRUCT(1, 2), ARRAY_CONSTRUCT(3, 4), 'non-overlapping';
INSERT INTO array_demo (ID, array1, array2, tip)
    SELECT 2, ARRAY_CONSTRUCT(1, 2, 3), ARRAY_CONSTRUCT(3, 4, 5), 'value 3 overlaps';
INSERT INTO array_demo (ID, array1, array2, tip)
    SELECT 3, ARRAY_CONSTRUCT(1, 2, 3, 4), ARRAY_CONSTRUCT(3, 4, 5), 'values 3 and 4 overlap';
INSERT INTO array_demo (ID, array1, array2, tip)
    SELECT 4, ARRAY_CONSTRUCT(NULL, 102, NULL), ARRAY_CONSTRUCT(NULL, NULL, 103), 'NULLs overlap';
INSERT INTO array_demo (ID, array1, array2, tip)
    SELECT 5, array_construct(object_construct('a',1,'b',2), 1, 2),
              array_construct(object_construct('a',1,'b',2), 3, 4), 
              'the objects in the array match';
INSERT INTO array_demo (ID, array1, array2, tip)
    SELECT 6, array_construct(object_construct('a',1,'b',2), 1, 2),
              array_construct(object_construct('b',2,'c',3), 3, 4), 
              'neither the objects nor any other values match';
INSERT INTO array_demo (ID, array1, array2, tip)
    SELECT 7, array_construct(object_construct('a',1, 'b',2, 'c',3)),
              array_construct(object_construct('c',3, 'b',2, 'a',1)), 
              'the objects contain the same values, but in different order';
Copy
SELECT ID, array1, array2, tip, ARRAY_INTERSECTION(array1, array2) 
    FROM array_demo
    WHERE ID <= 3
    ORDER BY ID;
+----+--------+--------+------------------------+------------------------------------+
| ID | ARRAY1 | ARRAY2 | TIP                    | ARRAY_INTERSECTION(ARRAY1, ARRAY2) |
|----+--------+--------+------------------------+------------------------------------|
|  1 | [      | [      | non-overlapping        | []                                 |
|    |   1,   |   3,   |                        |                                    |
|    |   2    |   4    |                        |                                    |
|    | ]      | ]      |                        |                                    |
|  2 | [      | [      | value 3 overlaps       | [                                  |
|    |   1,   |   3,   |                        |   3                                |
|    |   2,   |   4,   |                        | ]                                  |
|    |   3    |   5    |                        |                                    |
|    | ]      | ]      |                        |                                    |
|  3 | [      | [      | values 3 and 4 overlap | [                                  |
|    |   1,   |   3,   |                        |   3,                               |
|    |   2,   |   4,   |                        |   4                                |
|    |   3,   |   5    |                        | ]                                  |
|    |   4    | ]      |                        |                                    |
|    | ]      |        |                        |                                    |
+----+--------+--------+------------------------+------------------------------------+
Copy

๋‹ค์Œ์€ NULL ๊ฐ’ ์‚ฌ์šฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

SELECT ID, array1, array2, tip, ARRAY_INTERSECTION(array1, array2) 
    FROM array_demo
    WHERE ID = 4
    ORDER BY ID;
+----+--------------+--------------+---------------+------------------------------------+
| ID | ARRAY1       | ARRAY2       | TIP           | ARRAY_INTERSECTION(ARRAY1, ARRAY2) |
|----+--------------+--------------+---------------+------------------------------------|
|  4 | [            | [            | NULLs overlap | [                                  |
|    |   undefined, |   undefined, |               |   undefined,                       |
|    |   102,       |   undefined, |               |   undefined                        |
|    |   undefined  |   103        |               | ]                                  |
|    | ]            | ]            |               |                                    |
+----+--------------+--------------+---------------+------------------------------------+
Copy

์ด ์˜ˆ๋Š” OBJECT ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ์‚ฌ์šฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

SELECT ID, array1, array2, tip, ARRAY_INTERSECTION(array1, array2) 
    FROM array_demo
    WHERE ID >= 5 and ID <= 7
    ORDER BY ID;
+----+-------------+-------------+-------------------------------------------------------------+------------------------------------+
| ID | ARRAY1      | ARRAY2      | TIP                                                         | ARRAY_INTERSECTION(ARRAY1, ARRAY2) |
|----+-------------+-------------+-------------------------------------------------------------+------------------------------------|
|  5 | [           | [           | the objects in the array match                              | [                                  |
|    |   {         |   {         |                                                             |   {                                |
|    |     "a": 1, |     "a": 1, |                                                             |     "a": 1,                        |
|    |     "b": 2  |     "b": 2  |                                                             |     "b": 2                         |
|    |   },        |   },        |                                                             |   }                                |
|    |   1,        |   3,        |                                                             | ]                                  |
|    |   2         |   4         |                                                             |                                    |
|    | ]           | ]           |                                                             |                                    |
|  6 | [           | [           | neither the objects nor any other values match              | []                                 |
|    |   {         |   {         |                                                             |                                    |
|    |     "a": 1, |     "b": 2, |                                                             |                                    |
|    |     "b": 2  |     "c": 3  |                                                             |                                    |
|    |   },        |   },        |                                                             |                                    |
|    |   1,        |   3,        |                                                             |                                    |
|    |   2         |   4         |                                                             |                                    |
|    | ]           | ]           |                                                             |                                    |
|  7 | [           | [           | the objects contain the same values, but in different order | [                                  |
|    |   {         |   {         |                                                             |   {                                |
|    |     "a": 1, |     "a": 1, |                                                             |     "a": 1,                        |
|    |     "b": 2, |     "b": 2, |                                                             |     "b": 2,                        |
|    |     "c": 3  |     "c": 3  |                                                             |     "c": 3                         |
|    |   }         |   }         |                                                             |   }                                |
|    | ]           | ]           |                                                             | ]                                  |
+----+-------------+-------------+-------------------------------------------------------------+------------------------------------+
Copy

๋ฐฐ์—ด์— ์žˆ๋Š” NULL ๊ฐ’์€ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€๋งŒ, ๋ฐฐ์—ด ๋Œ€์‹  NULL์„ ์ „๋‹ฌํ•˜๋ฉด ๊ฒฐ๊ณผ๋Š” NULL์ž…๋‹ˆ๋‹ค.

SELECT array_intersection(ARRAY_CONSTRUCT('A', 'B'), 
                          NULL);
+------------------------------------------------+
| ARRAY_INTERSECTION(ARRAY_CONSTRUCT('A', 'B'),  |
|                           NULL)                |
|------------------------------------------------|
| NULL                                           |
+------------------------------------------------+
Copy