Google Sheets Запрос на возврат условного выбора?

Полный 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 только Apple возвращается Я собирался сделать это с листами if и 2 запроса в зависимости от того, [] присутствует, но интересно, если это выполнимо в одном операторе SQL.

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

2 ответа

Хорошо, так как бы вы сделали это в листах 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&"'"),"")))

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

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

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 || ']')

Другие вопросы по тегам