Как вы запрашиваете массив в стандартном SQL, который соответствует определенному условию? - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь получить записи, массивы которых соответствуют только определенному условию.

Например, я хочу получить только результаты, содержащие "IAB3".

Вот как выглядит таблица

Имя таблицы:

ставки

Имена столбцов:

BidderBanner / WinCat

Записи:

1600402 / null
1911048 / null
1893069 / [IAB3-11, IAB3]
1214894 / IAB3

Как я изначально думал, что это будет

SELECT * FROM bids WHERE WinCat = "IAB3" 

, но я получаю ошибку, в которой говорится, что нет совпадения с массивом типов операторов, строкой.

База данных находится в Google Big Query.

Ответы [ 4 ]

2 голосов
/ 12 апреля 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT * FROM `project.dataset.bids` WHERE 'IAB3' IN UNNEST(WinCat)

Вы можете протестировать, поиграть с выше, используя примеры данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.bids` AS (
  SELECT 1600402 BidderBanner, NULL WinCat UNION ALL
  SELECT 1911048, NULL UNION ALL
  SELECT 1893069, ['IAB3-11', 'IAB3'] UNION ALL
  SELECT 1214894, ['IAB3'] 
)
SELECT * FROM `project.dataset.bids` WHERE 'IAB3' IN UNNEST(WinCat)  

с результатом

enter image description here

1 голос
/ 12 апреля 2019

Один метод использует unnest(), что-то вроде этого:

SELECT b.*
FROM bids b
WHERE 'IAB3' IN (SELECT unnest(b.WinCats))

Однако синтаксис массива варьируется в зависимости от базы данных, которая его поддерживает, и они не являются частью "стандартного SQL".

1 голос
/ 12 апреля 2019

вам нужно использовать одинарные кавычки в sql для всех строк. это должно быть ГДЕ WinCat = 'IAB3', а не ГДЕ WinCat = "IAB3"

0 голосов
/ 12 апреля 2019

это будет работать:

SELECT * FROM bids WHERE REGEXP_LIKE (WinCat, '(.)*(IAB3)+()*'); 
...