2013-01-13 4 views
1

필자는 SQL 쿼리를 수행하는 좋은 방법을 찾기 위해 where 문을 사용할 수있는 곳을 찾고있었습니다.이 문은 공백으로 남겨두면 전혀없는 것처럼 작동합니다. 나는 꽤 잘 작동하는 것 같다 어떤이를 발견했습니다 : 나는 @value에 값을 지정하면 내가 원하는처럼이 SQL 문은 왜 작동합니까?

WHERE (Column = @value OR @value is null) 

, 검색이 필터링됩니다. 하지만 null을 전달하면 @value는 아무 것도 될 수 있다고 말하는 것과 같습니다. 나는 이것을 좋아한다. 이것은 좋다. 내가 이해하지 못하는 것은 왜 이것이 이같이 일하는가?

+2

'@value is null'은 값이 'anything'이 아닙니다. 실제로는 @value가 아무것도 아니라고 말하고 있습니다. 이게 네가 원하는거야. @value는 아무 것도 아니거나 (아무것도 compmared 수 없습니다) 또는 뭔가가 - 다음 특정 @value 비교할 수 있습니다. 그런데 왜 그것은 실존주의 철학과 같은 것처럼 들렸습니까? : -} – DWright

+0

@DWright 대단 했어 .--). null에 대한 논의는 어렵습니다. 특히 SQL null을 (다소) C#/Java 및 기타 명령형 (?) 언어의 null을 이해하기 쉽도록 비교할 때. 같은 이름, 다른 개념. – XIVSolutions

+0

원하는 경우 같은 일을하는 또 다른 방법은 다음과 같습니다.'WHERE Column = ISNULL (@value, Column) ' – MarkD

답변

3

@value가 null의 경우, 절 :

WHERE (Column = @value OR @value is null) 

WHERE (Column = @value OR 1=1) 

로 줄여 OR 함께

(이것은 다른 일반적인 언어 if (Column == value || true)과 유사)가 true입니다 피연산자 중 하나가 참인 경우 : SQL uses three valued logic

+---------+------+---------+---------+ 
| A OR B | TRUE | Unknown | FALSE | 
+---------+------+---------+---------+ 
| TRUE | TRUE | TRUE | TRUE | 
| Unknown | TRUE | Unknown | Unknown | 
| FALSE | TRUE | Unknown | FALSE | 
+---------+------+---------+---------+ 

그래서 :

  • @value가 null의 경우, 오른쪽 당신의 절은 사실이다, 그래서 전체 조건이 참하고 WHERE 절은 항상 만족하실 것입니다 WHERE.
  • @ 값 이 아닌 경우 WHERE 절의 오른쪽이 거짓이고 WHERE 절이 만족되는지 여부는 Column = @value에 따라 다릅니다.

    1) @value은 "뭔가"입니다 :

+0

이 정보와 설명을 모두 천천히 편집 했으므로 지켜보고있는 것이 재미 있습니다 – cost

+0

ASCII 테이블 생성기 웹 사이트는 세미 - 힘들게 진리표를 입력 한 직후에 나온 것입니다. 나는 다시 편집하고 싶은 유혹을 받았지만 어느 시점에서 그만 두어야했습니다. :-) –

+0

@MichaelPetrotta :'Column = @value OR 1'은 SQL Server에서 작동하지 않으므로 1은 어떤 조건으로 대체되어야합니다. 그것을 정정하거나 이것으로 도와주세요. –

1

음 두 가지 경우가 있습니다.

"something"이 결코 null이 아니기 때문에 두 번째 절은 항상 false입니다. 따라서 효과적으로 남은 것은 WHERE Column = @value입니다. 널 아무것도 동일하지 않기 때문에

2) @value는 두 번째 절은 항상 false입니다,이 경우

null입니다. 따라서 효과적으로 남아있는 것은 모두 WHERE @value is null이고 @value는 null로 알려져 있으므로 WHERE 1 = 1과 비슷하며 전체 WHERE는 무시됩니다. 데이터베이스는 데이터를 만지기 전에 이것을 알아낼 수있을 정도로 영리해야합니다. 따라서 조건을 전혀 지정하지 않은 경우처럼 수행해야합니다.

그래서 여기에는 두 가지처럼 행동 할 수있는 단일 SQL 문이 있으며 "선택적 WHERE"가 있습니다. 두 가지 경우에 대한 두 개의 개별 SQL 문에 대한 이점은 SQL 문을 작성할 때 응용 프로그램에 조건부 논리가 필요하지 않다는 것입니다 (두 개 이상의 "토글"이있는 경우 실제로 털이 나올 수 있음).