2017-02-27 9 views
0

나는 간단한 쿼리를 (실제 쿼리는 더 복잡 할 것이다. 그것은 동적 쿼리입니다)모든 데이터베이스에 대해 SQL LIKE NULL 구문이 유효합니까?

SELECT * FROM Employee WHERE @firstName IS NULL OR firstName LIKE @firstName 

@firstName이 전달됩니다

  • 로 NULL
  • '% 이름 %'

@firstName을 '% name %'(으)로 전달한 경우. 쿼리가 제대로 작동합니다.

@firstName이 NULL로 전달 된 경우. 쿼리는 것

SELECT * FROM Employee WHERE NULL IS NULL OR firstName LIKE NULL 

// This query is valid syntax on MSSQL and return all employees 
// because NULL IS NULL evaluated as TRUE 
// And firstName LIKE NULL evaluated as FALSE -- I guess 

내 질문이

모든 SQL 데이터베이스에 유효한 firstName을 LIKE NULL이다?

그리고 항상 FALSE로 평가됩니까?

이 같은 구문 https://www.w3schools.com/SQl/sql_like.asp

https://msdn.microsoft.com/en-us/library/ms179859.aspx

을 확인했다하지만 내 대답을 찾지 못했습니다. 감사!

답변

1

예, LIKE NULL은 모든 RDBMS에서 유효합니다. LIKE은 연산자 다음에 문자열이오고 문자열은 null 일 수 있습니다. 그래서 아무런 문제 없습니다. UNKNOWN로 - (특히 NULL와 비교된다 IS 제외 등 <, <=, =, <>, LIKE) 결과

어떤 조작없이, NULL에 값을 비교하지 않는다.UNKNOWNTRUE이 아니므로 NULL 인 경우 조건을 충족하지 못합니다. 어쨌든, 경우에 @firstName@firstName IS NULLTRUE로 평가 NULL을 포함, 그래서 무슨 일이 있어도 다음에 LIKE @firstName 결과 (두 조건 중 하나 이상이 TRUE@firstName IS NULL OR firstName LIKE @firstNameTRUE 때문에)도하지 않습니다.

+0

답변 해 주셔서 감사합니다. Upvoted! – Loc

+0

Mssql, MySQL, PostgreSQL, SQLite에서 LIKE NULL을 테스트했습니다. 그들은 잘 작동했다. 그러나 Oracle 데이터베이스에서는 실패했습니다. – Loc

+0

* 어떻게 실패 했습니까? 오라클 11.2에서는 제게 잘 작동합니다. 그리고 나는 오라클 버전이이를 제대로 처리하지 못할 것이라고 실제로 생각합니다. 그것은 심각한 버그 일 것입니다. –

0

이전에 질문되었습니다. 여기에 좋은 답변을 coulpe은 다음과 같습니다

like '%' does not accept NULL value

Behaviour of NOT LIKE with NULL values

당신은 단순히 값이 널 (null) 종료의 경우, 구문하게 확인하려는 경우 : 직원 FROM

SELECT * firstName을가 NULL

(NULL은 항상 true를 반환합니다. 이는 "WHERE 1 = 1"과 동일합니다). 희망이 다소 도움이됩니다.

2
LIKE NULL 

은 SQL92 표준을 지원하거나 구현하는 RDBMS에 대한 의미있는 표현이 아닙니다.

먼저 [NULL]까지 [C.J. 날짜로 돌아가는]은 "알 수 없음"을 의미하므로 '알 수 없음'이 될 수 없습니다.

NULL에 대한 유일한 유효한 테스트는 "IS NULL"또는 "IS NOT NULL"입니다.

+0

나는 LIKE NULL이 RDBMS에 대해 의미가 없지만 유효한 구문이며 FALSE로 평가된다는 것에 동의합니까? – Loc

+0

정의되지 않은/동작은 SQL 92 표준에 정의되어 있지 않습니다. MS SQL 동작이 다른 엔진에서 일관되지 않습니다. –

+0

인기있는 RDBMS에서 쿼리를 테스트해야합니다. 감사! – Loc