2013-02-22 3 views
0

특정 행에 대해 u/1u/3u/19/g1/g4과 비슷한 문자열을 포함하는 데이터베이스 열이 있습니다.배열의 요소 포함 여부를 확인하는 SQL 쿼리

다음 열 중 하나 이상의 요소가있는 모든 행을 얻는 방법이 있습니까? ['u/3', 'g4']?

은 내가 AND 절을 사용할 수 있습니다 알고 있지만, 구성 요소의 수에 따라 다름에 대해 확인하고 내 프로젝트의 RoR/액티브를 사용하고

.. 대형 될 수 있습니다.

+0

나는 그 where 절에 대한 결과를 생성하기 위해 전체 테이블 스캔이 필요하지 않은 dbms가 있다고 생각하지 않습니다. 해당 열을 fk로 두 테이블로 정규화 할 수 없으므로 내부 조인을 사용할 수 있습니까? – rene

+0

검사 할 어레이가 크기가 다른 경우 어떻게 전체 절 스캔을 사용하여 where 절을 구성 할 수 있습니까? – ErwinM

+0

제가 아는 한 그런 방법은 없습니다. 언급 된 @rene으로 리팩토링 db를 제안하십시오. –

답변

0

SQL Server에서 XML을 사용하여 검색 매개 변수 목록을 레코드 집합으로 변환 한 다음 기본 테이블과 교차 조인하고 charIndex()를 수행하여 열에 하위 문자열이 들어 있는지 확인할 수 있습니다.

나는 테이블 또는 컬럼 이름을 모르기 때문에, 나는 이미 데이터가있는 테이블 (명)을 사용했다.이 테이블에는 'phone_home'컬럼이있다. '202'을 포함 또는 전화 번호를 검색하려면 '785'내가이 쿼리를 사용합니다 : 더 이상의 값과 일치하는 경우 중복 레코드를 얻을 것이다

select person_id,phone_home,Split.data.value('.', 'VARCHAR(10)') 
from (select *, cast('<n>202</n><n>785</n>' as XML) as myXML 
     from persons) as data cross apply myXML.nodes('/n') as Split(data) 
where charindex(Split.data.value('.', 'VARCHAR(10)'),data.phone_Home) > 0 

을, 그래서 거기에 뚜렷한를 던져 및 제거 원하는 경우 select 문에서 분할하십시오. SQL에서

사용하여 XML 내가이 게시물 http://www.sqljason.com/2010/05/converting-single-comma-separated-row.html

어떤 것인지 성능 어떤 아이디어에서 생각이있어 ... 나에게 부두 마법 ...하지만 적어도 어느 커서 또는 동적 SQL이 없습니다.

편집 : XML을 캐스팅하는 것은 꽤 느려서 변수를 만들어서 한 번만 캐스팅됩니다.

declare @xml XML 
set @xml = cast('<n>202</n><n>785</n>' as XML) 

select person_id,phone_home,Split.persons.value('.', 'VARCHAR(10)') 
from persons cross apply @xml.nodes('/n') as Split(persons) 
where charindex(Split.persons.value('.', 'VARCHAR(10)'),phone_Home) > 0 
관련 문제