# #sql #google-bigquery #where-clause
Вопрос:
Как написать предложение where, которое фильтрует любые строки, равные Not or NO
.
Проблема в том, что данные относятся ко многим столбцам, поэтому мне нужно избегать написания определенного места для каждого столбца, например where a not in ("Not","NO") and b a not in ("Not","NO")
, и так далее.
Это не работает, потому что слишком много столбцов.
Стол:
name a b c d e (so on... there are lots more column)
joe good yes Not NO yes
mike yes yes yes good well
louis Not yes NO yes NO
jhon yes NO well Not yes
Желаемый результат:
name a b c d e
mike yes yes yes good well
Ответ №1:
Используйте следующий подход
select *
from `project.dataset.table` t
where not regexp_contains(format('%T', t), r'(?i)"not"|"no"')
Комментарии:
1. Это сработало, большое вам спасибо. Единственным недостатком является то, что для запуска требуется некоторое время, но это нормально
Ответ №2:
Равенство имеет симметрию, поэтому вы могли бы также сделать
where 'Not' not in (a,b,c,d,e) and 'No' not in (a,b,c,d,e);
Комментарии:
1. Спасибо, никогда не знал, что это можно сделать в обратном порядке, например, имена полей условий столбцов. Приятно знать, что
Ответ №3:
Попробуйте это решение.
Таблица Образцов:
SELECT * FROM [dbo].MainTable
Решение:
DECLARE @TableName nvarchar(256) = 'MainTable';
DECLARE @sql nvarchar(max) = '';
SELECT @sql = @sql
CASE
WHEN @sql = '' THEN ''
ELSE ' AND '
END '[' cols.COLUMN_NAME ']' ' NOT IN (''Not'',''No'')'
FROM INFORMATION_SCHEMA.COLUMNS cols
WHERE cols.TABLE_NAME = @TableName;
select @sql = 'SELECT * FROM ' @TableName ' WHERE ' @sql
execute(@sql)
Результат: