2011-08-03 2 views
0

업데이트 2를 작동하지 : 행 중 하나에서SQL 좋아하지 -

, 열 closed_by에서, 그것은 null이 포함되어 있습니다. null을 텍스트로 바꾸면 쿼리가 작동하기 시작하지만 null과 함께 작동하지 않습니다. 따라서 null이 문제가 되겠지만 null이있는 행은 pqr이 아닌 null과 같은 행을 반환해야합니다.

UPDATE 1 :

는 또한 set @user = 'pqr'을 시도하지만, 차이는 없습니다. 행 중 하나가 pqr을 포함하지 않으므로 1 행을 리턴해야 할 때 여전히 0 행을 리턴합니다.

원래의 질문 :

내가 제공 한 ID를 포함하지 않는 행을 반환하는 것을 시도하고있다

:

declare @user varchar(3) 
set  @user = 'pqr' 

select * from table1 where not(closed_by like @user) 

closed_by이

abc,def,ghi,jkl,mno 

같은 데이터를 포함를하지만 더 저를 준다 오류가 발생하여 데이터가 반환되지 않으면 1 행에 pqr이 없기 때문에 단일 행을 반환해야합니다.

내가 잘못하고 있는지 확실하지 않습니다.

+0

어떤 행'pnr'에 거기 있지 않습니까 ??? 귀하의 예제에 따라 'pnr'은 no입니다. –

+0

와일드 카드 문자를 추가 할 때 @user의 크기를 3 대신 5로 설정 했습니까? – StevieG

+0

업데이트 2에 대한 참고 사항 : NULL 논리가 작동하는 방법에 대한 아래의 응답 및 기타 참조를 확인하십시오. – MatBailie

답변

1

당신은 와일드 카드 문자를 포함해야합니다. 그들 없이는 실제로는 WHERE NOT (closed_by = @user)입니다.

또한 우발적 인 일치에주의하십시오. 예를 들어 LIKE '%a%'은 예제 레코드와 일치합니다. 이러한 경우 쉼표로 구분 된 목록의 시작과 끝 부분에도 쉼표가 사용됩니다.이러한; ',abc,def,ghi,jkl,mno,' LIKE '%,ghi,%'

그러나 더 이상, 당신은 관계형 데이터베이스를 사용하고 있습니다. 정규화 된 구조에서 자체 레코드이므로 각 항목을 사용하는 것이 좋습니다. 이는 1 : 1 관계보다는 1 : 많은 관계를 제공하지만 INDEX의 이점과 쿼리의 유연성을 훨씬 높일 수 있습니다. (귀하의 LIKE 예는 인덱스를 사용할 수 없습니다.)

REPLY 2를 업데이트하려면 :

는 NULL 논리 작품을 가정하는 방법에주의하십시오.

  • NULL LIKE '%pqr%'의 결과는 NULL이다
  • NOT (NULL)의 결과는

당신은 WHERE NOT (ISNULL(closed_by, '') LIKE '%pqr%')

3

당신은 syntax of the LIKE operator 확인 할 수 있습니다 - 그것은 패턴을 accetps 그래서 당신이 대신 같은 것을 사용해야합니다 :

declare @user varchar(5) 
set @user = '%pqr%' 

'%'는 와일드 카드와 zeor의 문자열과 일치 또는 더 많은 chracters.

FYI - SQL Server에서는 와일드 카드로 시작하는 LIKE 패턴과 함께 인덱스를 사용할 수 없으므로 큰 데이터 세트에서 쿼리가 잘못 수행 될 수 있습니다.

select * from table1 where closed_by not like @user 

을 그리고 당신은 값의 일부가 검색 할 수있는 SQL 서버에게 적절한 '%'문자를 추가해야 할 수도 있습니다

+0

나는 여러 번 시도했지만 어떤 이유로 든 차이가 없다. – oshirowanen

+0

@oshirowanen'@ user'의 크기를 5로 변경하는 것을 잊지 않으셨습니까? 만약 변수가 여전히 3 글자라면'% pq'를 사용했을 것입니다. – Justin

0

이보십시오. 예를 들어 'pqr %'

0

당신이 정말로 등가물을 찾고 있으며 와일드 카드가 일치하지 않는다고 생각됩니다. 이 시도 :

declare 
@user varchar(5) 
set @user = '%pqr%' 

select * 
from table1 
where isnull(closed_by, '') not like @user 
1

당신이 좋아 사용할 때 %_ 와일드 카드 문자를 사용해야합니다

select * from table1 where closed_by <> @user 
+0

? SQL Server에서 와일드 카드가 아닙니다. Access 나 다른 플랫폼을 생각해야합니다. SQL Server에서는 % 및 _입니다 ... –

1

NULL를 알 수없는 사용하도록 코드를 변경해야하기 때문에 그것이 여부를 알 수 NULL입니다 당신의 패턴과 비슷합니다.

DECLARE @user VARCHAR(5) = '%pqr%';  
SELECT ... WHERE COALESCE(closed_by, '') NOT LIKE @user; 

을 그리고 사실 당신은 아마 원하는 더 정확 : 당신은 사용하여 쉽게 해결할 수 나중에 'trv,pqrs,ltt' 같은 데이터가있는 경우

DECLARE @user VARCHAR(7) = '%,pqr,%';  
SELECT ... WHERE COALESCE(',' + closed_by + ',', '') NOT LIKE @user; 

이 방법, 그것은 거짓을 반환하지 않습니다 양.

그러나 모든 것을 말하면서, 이것을 더 정규화 된 방식으로 저장하는 것을 고려 했습니까? 쉼표로 구분 된 목록을 저장하는 것은 매우 문제가 될 수 있으며 이런 방식으로 구조화 된 데이터를 처리 할 때 직면하게되는 마지막 도전이되지는 않을 것이라고 확신 할 수 있습니다.

관련 문제