2009-10-27 4 views
1

좋아, 이건 멍청한거야. . . .예기치 않은 빈 쿼리 결과

Select * from <table> where <col1> is null and <col2> = 1; 

<col1>은 VARCHAR2 (5byte) 없음 defalut 값 <col2>은 번호 기본적으로 -1

왜 내 위의 쿼리가 모든 레코드를 반환하지 않습니다이다? 쿼리에서 결과 집합을 반환해야한다는 사실을 알고 있지만 아무것도 얻지 못합니다.

내가 할 경우 :

Select * from <table> where <col2> = 1; 

나는 86342 개 기록

가 null 값으로 오라클 거래를합니까 반환받을 :

Select * from <table> where <col1> is null; 

나는 내가 할 경우 127,531 기록

을 반환받을 이상한 방법으로? 나는 MSSQL 일종의 사람입니다.

+0

한 수정이 널 (null)과 빈 문자열 동일하게 취급한다는 것이다. 그래, 네, 그것은 이상한 방식으로 null을 처리하지만, 그것은 결과 집합에 영향을 미칠 것이라고 생각하지 않습니다 – bogertron

답변

7

당신이 작성한 것으로부터 쿼리가 레코드를 반환해야한다는 확신이 들지 않습니다. 두 조건을 모두 만족하는 행이 없다고 생각됩니다.

OR 두 조건 (두 조건 중 하나를 만족하는 레코드를 가져 오는 것)을 원할 수도 있습니다.

+0

이것은 맹목적으로 보스 지시어를 따라하는 것입니다. . . . – andrewWinn

1

각 필터에 대해 두 개의 개수가 있지만 모두 일치하는 레코드 수는입니다. 당신은 당신이 다음 쿼리를 실행할 수 있는지 확인하려면 다음

select count(*) from 
(
    Select * from <table> where <col1> is null 
    intersect 
    Select * from <table> where <col2> = 1) 
/

내 돈은 0

0

을 returing에 내가 할 경우 SELECT * 가 null 곳에서; 그러면 127531이 반환됩니다. 레코드가 반환됩니다. Select * from where = 1; 나는 내가 가진, 86342 개 기록

귀하의 sintax는, 어쩌면 당신은 OR을 사용하려고, 또는 어쩌면 당신의 DBMS가 이상한 일을하고있다 그러나 어쩌면 두 조건을 fullfills 레코드가없는 올바른 것 같다

을 반환받을 SQL Navigator 6과 같은 몇 가지 문제가있었습니다. 이미 문제를 수용하고 수정했습니다. Version 6.1

행운을 비네!

2

내가 선택한 결과가 올바르지 않으면 데이터가 문제가되고 Oracle/select 문제는 ​​아니라고 판단됩니다.

하지만 값이 없을 때 col1의 데이터가 null인지 확인 하시겠습니까? 데이터를 쓰는 프로세스에 따라 실제로는 "null"이 아닌 빈 값 ('')이 될 수도 있습니다.

그래서 더 시도, 안전을 위해 :

Select * from <table> where (<col1> is null or <col1> = '') and <col2> = 1;

1

내가 당신의 문제가 모두 COL1은 NULL이며, COL2 1. 할 일입니다 행이 없다고 생각합니다 ...

SELECT COUNT(*) 
FROM <table> 

테이블에 127531 + 86342 개가 넘는 레코드가 있습니까? 그러면 어떤 행도 조건을 충족시킬 수 없습니다. 또한 시도해보십시오 ...

SELECT COUNT(*) 
FROM <table> 
WHERE <col1> IS NOT NULL 
    OR <col2> IS NULL OR <col2> <> 1 

이렇게하면 고기가없는 행 수가 생깁니다. 테이블의 총 레코드 수와 같습니까? 그렇다면 귀하의 orignal 쿼리가 아무것도 반환하지 않는 것이 맞습니다.

나는 이상한 NULL 처리에 무슨 뜻인지 모르겠다. 나는 오라클이 다르게하는 유일한 점은 빈 문자열이 NULL이라는 것입니다. 오라클에서 문자열을 비교할 때는이를 명심해야합니다. 나도 당신이 이런 식으로 행동 MSSQL을 구성 할 수 있습니다.

기본적으로 (이상한 사용자 지정 구성없이) 나는 "부울"논리 표현식에서 사용될 때 MSSQL과 Oracle 모두 같은 방식으로 NULL을 처리합니다. 그러나 나는 그것이 어떻게 작동하는지 처음 배울 때 이상하다는 것을 알았다.

IS NULL, IS NOT NULL : 예상대로 작동합니다. 값이 NULL인지 여부에 따라 TRUE 또는 FALSE를 반환합니다.

다른 모든 운영자 : 비교되는 값 중 하나 또는 둘 모두가 NULL이면 작업 결과가 NULL입니다. 만약 하나 이상의 피연산자 :

모든 논리 연산자 (NOT, AND, OR, ...) : (예 : NULL < 1은 NULL로 평가 NULL = NULL은 NULL로 평가 NULL <> 1은 NULL로 평가) NULL 인 경우, NULL 값이 TRUE와 FALSE 일 수있는 것처럼 조작을 평가하십시오. 이 메소드가 TRUE를 리턴하는 경우와 FALSE를 리턴하는 경우 결과는 NULL입니다. (예 : NULL 및 FALSE는 FALSE로 평가되고 NULL 및 TRUE는 NULL로 평가되고 NULL은 NULL로 평가되지 않음)

조건에 따라 사용/조건 : NULL로 평가되는 논리식은 FALSE로 평가합니다. IF 블록은 실행되지 않으며 WHERE 표현식이 NULL로 평가되는 행은 반환되지 않습니다.

예 :

DECLARE 
    A NUMBER; 
BEGIN 
    A:=0; 
    IF NULL = NULL THEN 
    A:=1; 
    END IF; 
    DBMS_OUTPUT.PUT_LINE(A); -- this will print 0. 
END; 

-- without the WHERE clause, following query 
-- would result in a single row of single value "hi" 
SELECT 'hi' 
FROM dual 
WHERE 1 <> NULL OR NULL = NULL; -- this returns no rows 

편집은 : 내용과 코드 오라클과 주요 불만

관련 문제