[sql] SQL에“LIKE”와“IN”의 조합이 있습니까?

SQL에서는 LIKE거의 모든 정규화 규칙을 위반하는 데이터베이스로 인해 “슬프게도” “조건 을 사용해야 합니다. 지금은 바꿀 수 없습니다. 그러나 그것은 질문과 관련이 없습니다.

또한 WHERE something in (1,1,2,3,5,8,13,21)SQL 문의 가독성과 유연성을 높이기 위해 종종 같은 조건을 사용 합니다.

복잡한 하위 선택을 작성하지 않고이 두 가지를 결합 할 수있는 방법이 있습니까?

나는 WHERE something LIKE ('bla%', '%foo%', 'batz%')이것 대신 쉬운 것을 원한다 .

WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'

SQl Server 및 Oracle과 함께 일하고 있지만 RDBMS에서 이것이 가능한지 관심이 있습니다.



답변

SQL에는 LIKE & IN의 조합이 없으며 TSQL (SQL Server) 또는 PLSQL (Oracle)에는 훨씬 적습니다. 그 이유 중 일부는 전체 텍스트 검색 (FTS)이 권장되는 대안이기 때문입니다.

Oracle 및 SQL Server FTS 구현 모두 CONTAINS 키워드를 지원하지만 구문은 여전히 ​​약간 다릅니다.

신탁:

WHERE CONTAINS(t.something, 'bla OR foo OR batz', 1) > 0

SQL 서버 :

WHERE CONTAINS(t.something, '"bla*" OR "foo*" OR "batz*"')

쿼리하는 열은 전체 텍스트 인덱싱되어야합니다.

참고:


답변

명령문을 쉽게 읽을 수있게하려면 REGEXP_LIKE (Oracle 버전 10 이상에서 사용 가능)를 사용할 수 있습니다.

예제 테이블 :

SQL> create table mytable (something)
  2  as
  3  select 'blabla' from dual union all
  4  select 'notbla' from dual union all
  5  select 'ofooof' from dual union all
  6  select 'ofofof' from dual union all
  7  select 'batzzz' from dual
  8  /

Table created.

원래 구문 :

SQL> select something
  2    from mytable
  3   where something like 'bla%'
  4      or something like '%foo%'
  5      or something like 'batz%'
  6  /

SOMETH
------
blabla
ofooof
batzzz

3 rows selected.

REGEXP_LIKE를 사용한 간단한 쿼리

SQL> select something
  2    from mytable
  3   where regexp_like (something,'^bla|foo|^batz')
  4  /

SOMETH
------
blabla
ofooof
batzzz

3 rows selected.

그러나 …

성능이 좋지 않아서 직접 권장하지 않습니다. 여러 LIKE 술어를 고수했습니다. 따라서 예제는 재미있었습니다.


답변

당신은 붙어있다

WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'

임시 테이블을 채우고 (데이터에 와일드 카드 포함) 다음과 같이 조인하지 않는 한 :

FROM YourTable                y
    INNER JOIN YourTempTable  t On y.something LIKE t.something

SQL Server 구문을 사용하여 시도하십시오.

declare @x table (x varchar(10))
declare @y table (y varchar(10))

insert @x values ('abcdefg')
insert @x values ('abc')
insert @x values ('mnop')

insert @y values ('%abc%')
insert @y values ('%b%')

select distinct *
FROM @x x
WHERE x.x LIKE '%abc%'
   or x.x LIKE '%b%'


select distinct x.*
FROM @x             x
    INNER JOIN  @y  y On x.x LIKE y.y

산출:

x
----------
abcdefg
abc

(2 row(s) affected)

x
----------
abc
abcdefg

(2 row(s) affected)


답변

PostgreSQL에는 다음 ANY과 같은 ALL형식이 있습니다.

WHERE col LIKE ANY( subselect )

또는

WHERE col LIKE ALL( subselect )

여기서 subselect는 정확히 하나의 데이터 열을 리턴합니다.


답변

다른 솔루션은 모든 RDBMS에서 작동해야합니다.

WHERE EXISTS (SELECT 1
                FROM (SELECT 'bla%' pattern FROM dual UNION ALL
                      SELECT '%foo%'        FROM dual UNION ALL
                      SELECT 'batz%'        FROM dual)
               WHERE something LIKE pattern)


답변

위에 표시된 내부 조인 또는 임시 테이블 기술을 캡슐화하려면 TableValue 사용자 함수를 사용하는 것이 좋습니다. 이를 통해 좀 더 명확하게 읽을 수 있습니다.

http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx에 정의 된 split 함수를 사용한 후

“Fish”(int id, varchar (50) Name)라는 테이블을 기반으로 다음을 작성할 수 있습니다.

SELECT Fish.* from Fish
    JOIN dbo.Split('%ass,%e%',',') as Splits
    on Name like Splits.items  //items is the name of the output column from the split function.

출력

베이스 1 개
파이크
7 낚시꾼
8 월 아이


답변

한 가지 방법은 임시 테이블 (또는 SQL Server의 테이블 변수)에 조건을 저장하고 다음과 같이 조인하는 것입니다.

SELECT t.SomeField
FROM YourTable t
   JOIN #TempTableWithConditions c ON t.something LIKE c.ConditionValue