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