Google Sheets Запрос на возврат условного выбора? - PullRequest
0 голосов
/ 17 ноября 2018

Полный SQL любитель здесь.У меня есть лист Google, где пользователь вводит данные в формате A[B or C].Таким образом, используя эту таблицу:

+-------+-------------+-------------+
| A     | B           | C           |
+-------+-------------+-------------+
| Apple | Red         | Crunchy     |
| Pear  |             | Crunchy     |
| Lemon |             |             |
+-------+-------------+-------------+

.. Я ожидал бы следующие возвраты:

ввод apple[red] возврат Apple Red

ввод apple[crunchy] возврат Apple Crunchy

Таким образом, в основном только B или C возвращаются в дополнение к A в зависимости от того, в каком столбце произошло совпадение. В действительности crunchy может находиться в любом столбце B или C (но не оба).

Пока у меня есть это:

Select A, B, C where UPPER(H) matches '.*(?:^|,|,\s)"&REGEXEXTRACT(Q3,"^[^\[]+")&"(?:,\s|,|$).*' and B matches '"&REGEXEXTRACT(Q3, "\[(\w+)\]")&"' limit 1

Но, очевидно, это не работает, как я хочу, и совпадение возвращается A B Cкак и ожидалось.

Итак, я думаю, мои вопросы: вы можете условно вернуть столбец на основе совпадения, а также каков наилучший способ использования OR для совпадения B и C?Я пытался просто поставить and B or C matches, но это не удалось.Я полагаю, вы можете просто написать еще одну строчку, например B matches '"&REGEXEXTRACT(Q3, "\[(\w+)\]")&"' or C matches '"&REGEXEXTRACT(Q3, "\[(\w+)\]")&"', но все начинает становиться довольно запутанным, и я предполагаю, что есть более простой способ.

Еще одна вещь, которая меня интересует, это еслиэто способ сделать и B, и C необязательными, так что в приведенном выше примере, если пользовательский ввод apple only Apple возвращается.Я собирался сделать это с листами if и двумя запросами, в зависимости от того, присутствует ли [], но задавался вопросом, выполнимо ли это в одном операторе SQL.

Спасибо за любую помощь.Не останется волос с царапинами на голове!

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

ОК, так как бы вы сделали это в листах Google?Есть две проблемы с запросом Google Sheets, которые делают его немного неловким

(1) Нет союзов

(2) Вы не можете вернуть пустой набор - выдается сообщение об ошибкевместо этого.

Два отдельных запроса будут выглядеть следующим образом:

=ArrayFormula(query({A:B,A:A&"["&B:B&"]"},"select Col1,Col2 where Col3='"&F1&"'"))

и

=ArrayFormula(query({A:A,C:C,A:A&"["&C:C&"]"},"select Col1,Col2 where Col3='"&H1&"'"))

, где F1 и H1 содержат необходимые входные данные.

Чтобы объединить их, вы должны добавить операторы IFERROR:

=ArrayFormula(iferror(query({A:B,A:A&"["&B:B&"]"},"select Col1,Col2 where Col3='"&J1&"'"),iferror(query({A:A,C:C,A:A&"["&C:C&"]"},"select Col1,Col2 where Col3='"&H1&"'"),"")))

Предполагается, что только один из запросов дает результат.

0 голосов
/ 17 ноября 2018

Если я понимаю ваш вопрос, почему бы просто:

create table mytable (A text, B text, C text);
insert into mytable values ('Apple', 'Red', 'Crunchy'), ('Pear', null, 'Crunchy'), ('Lemon', null, null);
select * from mytable;

-- Example 1: input = apple[red]
select a, b from mytable where upper(a || '[' || b || ']') = upper('apple[red]')
union all 
  select a, c from mytable where upper(a || '[' || c || ']') = upper('apple[red]');

-- Example 2: Same query different input = apple[crunchy]
select a, b from mytable where upper(a || '[' || b || ']') = upper('apple[crunchy]')
union all 
  select a, c from mytable where upper(a || '[' || c || ']') = upper('apple[crunchy]'); 

Вы можете даже создать функциональные индексы на верхнем (a || '[' || b || ']') и верхнем (a|| '[' || c || ']')

...