2010-03-08 4 views
1

열이 많은 쿼리가 있습니다. 모든 열이 0이 아닌 행을 선택하고 싶습니다.모든 열이 값인 행을 필터링하는 가장 좋은 방법

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

실제로이 방법이 가장 효율적인 방법입니까?

내가 모든 열은 1, 또는 부정적인 ... 잘라 내기 및 붙여 넣기의 그것의 많은 ..

+0

NB : 한 의견에서, Mongus 필요한 대답은 "행 그렇지 않은 것을 말한다 모든 행 [의미 '열']이 = 0 인 경우. 이것은 영어 표현 "행의 어느 것도 0이 아닌 행"(현재의 질문 에서처럼)이 일반적으로 의미하는 것이 아닙니다. –

+0

@Jonathan, 죄송합니다. 예, 제 잘못입니다. 나는 논리 오류를 적어 두었습니다. 정정되었습니다. SQL 샘플이 정확합니다. 질문을 바로 잡았습니다 - 지금은 이해가되기를 바랍니다 ... 혼란스러운 논리! –

답변

1

쿼리를 매개 변수화하고 저장 프로 시저 또는 테이블 반환 함수에 넣을 수 있습니다. 선택한 값에 관계없이 쿼리를 고정 된 횟수 (작업 유형 당 한 번) 만 작성하면됩니다.

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

당신은 당신을 위해 계산을 수행하는 계산 된 열을 추가 할 수있을 때 무시를 변경해야 치죠. 기술적 인 측면에서는 기술적 인 측면에서 조금 헷갈 리지 않습니다. 이제 쿼리를 사용할 때 계산을 반복하지 않고 계산 된 열만 확인하면됩니다.

CREATE TABLE dbo.foo 
(
    col1 INT, 
    col2 INT, 
    col3 INT, 
    all_0 AS 
    (
     CONVERT(BIT, CASE 
      WHEN col1 = 0 AND col2 = 0 AND col3 = 0 
      THEN 1 ELSE 0 
     END) 
    ) 
); 

또한 약간 정돈 뭔가를 할 수와 같은 :

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

sum() 검사가 작동하지 않습니다. 나는 그것에 대해서도 생각했지만, 열 중 하나가 0이 아니면 실수로 (양수 값과 음수 값을 보상하지 않는 한) 대답이 0이되지 않습니다. –

+0

한 열이 +5이고 다른 열이 -5 인 경우 완벽하게 유효 할 수 있습니다.이 경우 행을 표시해야합니다. 우발적이지 않을 수도 있습니다 .. –

+0

그래, 추가 사항은 추가 고려 사항이었습니다.값이 더 엄격하게 제한된 경우에는 작동하지만 어떤 경우 에든 WHERE 절에서 확인하려는 대부분의 것들도 CHECK 제약 조건에서 검사 될 수 있으므로 첫 번째 부분은 여전히 ​​적절하다고 생각합니다. –

1

(1) 당신은 상태에서 잘못된 결합이 - 당신은 OR가 아닌 AND 필요합니다.

위 질문에 대한 수정 사항이 더 이상 올바르지 않습니다.

(2) 필터링 할 필요가있는 45 개의 열이있는 경우 작성한 것보다 더 나은 작업을 수행해야합니다. 고통 스럽지만 ...

이 관찰은 사실입니다.

+0

1. 모든 행이 = 0이 아닌 행을 원합니다. AND가되어야합니다. ;-) 2. 나는 두려워합니다! –

+0

@Mongus Pong : 음, 영어와 부정은 재미있는 일을합니다. 그러나 Q는 "어떤 열도 0이 아닌 행을 선택하려고합니다."라는 메시지가 표시됩니다. 즉 행 중 하나가 0이 아니거나 '모든 열이 0이 아니어야합니다.'는 의미입니다. 이는 "모든 열이 0 인 경우가 아닙니다"("적어도 하나의 열이 0이 아님"과 동일)와 다릅니다. –

+0

@ Mongus Pong : 부수적 인 질문 : 가치는 항상 부정적입니까? 가치는 얼마나 커질 수 있습니까? 필요한 조건을 설정하기 위해 N 열의 합이나 곱을 사용할 수 있습니다. 그러나 오버 플로우, 특히 곱셈에 대해 걱정해야합니다. –

1

CHECKSUM을 사용할 수 있습니다. 그러나, 나는 CHECKSUM의 내부를 모른다. 그래서 그것은 큰 데이터 세트에 대해 작동 할 것이라고 보장 할 수 없다. 45 개별 열 비슷한 의미를 가지고있는 것처럼

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 
3

그것은 나타납니다. 따라서 본인은이 표를 올바르게 정상화하는 것이 좋습니다. 그렇게했다면 쿼리가 더 간단 해지고 더 잘 수행 될 것입니다.

당신이 정규화 된 구조의 뷰를 생성하고이 쿼리에 대한 소스로 것을 사용할 수
+0

좋은 점은 아마도 SQL이 왜 이처럼 깔끔한 해결책을 제시하지 못하는지에 대해 설명합니다. 그러나이 경우 대량 쿼리를 수행하는 저장 프로 시저이며 각 열은 복잡한 쿼리의 결과입니다. 그 결과는 임시 테이블로 옮겨져 추가 처리됩니다. 그런 다음 반환하기 전에 관심이없는 행을 필터링해야합니다. –

0

:

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

관련 문제