Самый простой способ отфильтровать строки, где все столбцы = значение - PullRequest
1 голос
/ 08 марта 2010

У меня есть запрос с множеством столбцов. Я хочу выбрать строки, в которых не все столбцы равны 0.

select * from table
where 
not
( column1 = 0 and
  column2 = 0 and
  column3 = 0 and
  ...
  column45 = 0)

Это действительно самый аккуратный способ сделать это?

Предположим, мне нужно изменить его, чтобы он игнорировался, когда все столбцы равны 1 или отрицателен. Его много вырезали и вставляли.

Ответы [ 6 ]

3 голосов
/ 08 марта 2010

Похоже, что 45 отдельных столбцов имеют аналогичное значение. Поэтому я бы посоветовал вам правильно нормализовать эту таблицу. Если бы вы это сделали, запрос был бы проще и, вероятно, работал бы лучше.

1 голос
/ 08 марта 2010

Вы можете использовать CHECKSUM. Однако я не знаю внутреннюю часть CHECKSUM, поэтому не могу гарантировать, что она будет работать с большими наборами данных.

CREATE TABLE dbo.FooBar (
    keyCol int NOT NULL IDENTITY (1, 1),
    col1 int NOT NULL,
    col2 int NOT NULL,
    col3 int NOT NULL
    )

INSERT FooBar (col1, col2, col3)
SELECT -45, 0, 45
UNION ALL
SELECT 0, 23, 0
UNION ALL
SELECT 0, 0, 0
UNION ALL
SELECT 1, 0, 0

SELECT
   CHECKSUM(col1, col2, col3)
FROM
   dbo.FooBar

SELECT
   *
FROM
   dbo.FooBar
WHERE
   CHECKSUM(col1, col2, col3) = 0
1 голос
/ 08 марта 2010

Вы можете параметризировать запрос и поместить его в хранимую процедуру или табличную функцию. Вам нужно всего лишь написать запрос фиксированное количество раз (один раз для каждого типа операции) независимо от выбранных вами значений.

create function dbo.fn_notequal_columns
(
    @value int
)
returns table
as
(
    select * from [table]
    where column1 <> @value and column2 <> @value ...
)

select * from dbo.fn_notequal_columns(0)
1 голос
/ 08 марта 2010

(1) У вас неправильное соединение в условии - вам нужно ИЛИ, а не AND.

С измененным вопросом вышеприведенное наблюдение более не является правильным.

(2) Если у вас есть 45 столбцов, по которым вам нужно отфильтровать, вам будет сложно сделать что-то лучше, чем написанное. Боль хоть и будет ...

Это наблюдение остается верным.

0 голосов
/ 08 марта 2010

Вы можете создать представление нормализованной структуры и использовать его в качестве источника для этого запроса:

SELECT all other fields, 'Column1', COL1 FROM tableName<br> UNION<br> SELECT all other fields, 'Column2, COL2 FROM TableName<br> UNION ...<br> SELECT all other fields, 'Column45', COL45 FROM tableName

0 голосов
/ 08 марта 2010

Вы можете добавить вычисляемый столбец, который выполняет вычисления за вас.Технически он не является более аккуратным, за исключением того, что теперь, когда вы используете его в любом запросе, вам нужно только проверять вычисляемый столбец, а не повторять вычисление.:

WHERE col1 + col2 + col3 = 0 -- or 45, if there are 45 such columns
                             -- and you are looking for each column = 1
...