2012-05-25 2 views
4

SQL Server에서 여러 값에 대한 열을 검색해야하지만 정확한 값이 없으므로 와일드 카드도 사용해야합니다. 내가 어떤 한 개인 값을 검색 할 경우, 나는 그것을 발견, 그래서 그들이 거기에있어 알고와일드 카드를 사용해야하는 열에서 여러 값을 검색하려면 어떻게합니까?

SELECT * 
FROM table 
WHERE fieldname in ('%abc1234%', 
        '%cde456%', 
        '%efg8976%') 

이 어떤 결과를 반환하지 않으며, 아직 :

나의 현재 쿼리는 다음과 같습니다. 수백 개의 값으로 다루기가 힘들다는 다중 OR을 수행하는 것의 부족한 점이 있습니다.

나는이 쿼리가 작동하지 않는 이유에 대해 알고 싶습니다. 몇 가지 정확한 일치를 포착하는 작은 문제를 제외하고는 %의 작업이없는 동일한 쿼리가 제대로 작동하기 때문입니다.

+0

'in'은'= '연산자를 사용하고 와일드 카드는'LIKE' 연산자 만 사용하기 때문에 작동하지 않습니다. – Blorgbeard

+1

[this] (http://stackoverflow.com/questions/8832182/sql-expading-in-to-like)와 [this] (http://stackoverflow.com/questions/4335359/is-it- 사용 가능하고 사용하기 쉬운 것과 같이) –

+0

아, 이제 알겠습니다. Mental 판사의 두 번째 링크에는 왜 그것이 작동하지 않았는지를 설명하는 좋은 대답이 있습니다. 하나의 오해가 적은 나는 먹이에 빠지게 될 것이다! – Kirsten

답변

11

Fulltext Index을 사용하십시오. 즉 검색과 훨씬 더 나은 일을하고해야 당신의 "OR"부팅에 작은 좋네요 문제 :

SELECT * 
FROM table 
WHERE CONTAINS(fieldname, '"abc1234" OR "cde456" OR "efg8976"') 

항목 :

http://www.simple-talk.com/sql/learn-sql-server/full-text-indexing-workbench/

+0

감사합니다. 더 많은 가치를 가지고 다시해야한다면 인덱스를 살펴볼 것입니다. 이 경우, 내가 가진 가치의 수를 조사하고, 밤의이 시간에 문제를 일으키기에 충분하지 않으며, OR로 합쳐진 일련의 LIKE 문을 수행하기로 결정했습니다. 그것은 내가 필요한 것을 해냈다. – Kirsten

4

쿼리가 작동하지 않는 이유는 괄호 안의 값 목록 내에서 fieldname과 정확히 일치하는 항목을 찾는 것입니다. 와일드 카드가 고려되는 곳에서는 LIKE 비교를 수행하지 않습니다. 당신이 원하지 않는 것을 분명히

SELECT * from table 
where fieldname = '%abc1234%' OR 
     fieldname = '%cde456%' OR   
     fieldname = '%efg8976%' 

:

그래서 쿼리는 동일합니다.

2
select table.* from (
    table join (select * from values 
        ( ('%abc1234%'), ('%cde456%'), ('%efg8976%') ) 
       ) 
        as search(exp) on 0 = 0 
) where fieldname like exp 

혹은

select table.* from 
    table join 
    (select * from values (
     ('%abc1234%'), ('%cde456%'), ('%efg8976%') 
    ) as search(exp) 
on fieldname like exp 

모듈로 확실 해요 일부 구문.

요점은 값 목록 만이 유일한 매개 변수가 될 수 있다는 점입니다.

관련 문제