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)"®EXEXTRACT(Q3,"^[^\[]+")&"(?:,\s|,|$).*'
and B matches '"®EXEXTRACT(Q3, "\[(\w+)\]")&"' limit 1
Но, очевидно, это не работает, как я хочу, и матч возвращается A B C
как и ожидалось.
Итак, я думаю, мои вопросы: вы можете условно вернуть столбец на основе совпадения, а также каков наилучший способ использования OR
для B
а также C
матч? Я пытался просто положить and B or C matches
но это не удается. Я думаю, вы можете просто написать еще одну строку, как B matches '"®EXEXTRACT(Q3, "\[(\w+)\]")&"' or C matches '"®EXEXTRACT(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 || ']')