Как отфильтровать таблицу по тому, содержит ли какой-либо из столбцов значение x

# #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)
 

Результат:

введите описание изображения здесь