LIKE 연산자에 여러 조건을 도입하려면 어떻게 해야 하나요?
SQL 스테이트먼트를 다음과 같이 쓰고 싶습니다.
select * from tbl where col like ('ABC%','XYZ%','PQR%');
다음을 사용하여 할 수 있다는 것을 알고 있습니다.OR
하지만 더 나은 해결책이 있는지 알고 싶습니다.
이것은 임시 테이블의 좋은 사용법입니다.
CREATE TEMPORARY TABLE patterns (
pattern VARCHAR(20)
);
INSERT INTO patterns VALUES ('ABC%'), ('XYZ%'), ('PQR%');
SELECT t.* FROM tbl t JOIN patterns p ON (t.col LIKE p.pattern);
이 예에서는, 이 예에서는,col
두 개 이상의 패턴과 일치할 수 있으므로 각 행이 표시됩니다.tbl
그 결과, 최대 한 번에.하지만 당신의 패턴이 그렇다면col
일치시킬 수 있습니다.DISTINCT
쿼리 수식자
SELECT DISTINCT t.* FROM tbl t JOIN patterns p ON (t.col LIKE p.pattern);
Oracle 10g에는 SQL에서 POSIX 호환 정규 표현을 사용할 수 있는 함수가 있습니다.
- REGEXP_LIKE
- REGEXP_치환
- REGEXP_INSTR
- REGEXP_SUBstr
이 함수에 대한 자세한 구문은 Oracle Database SQL Reference를 참조하십시오.
예를 들어 Perl의 정규 표현을 살펴보세요.
코드:
select * from tbl where regexp_like(col, '^(ABC|XYZ|PQR)');
대체 방법은 다음과 같습니다.
select * from tbl where col like 'ABC%'
union
select * from tbl where col like 'XYZ%'
union
select * from tbl where col like 'PQR%';
검증하기 위한 테스트 코드는 다음과 같습니다.
create table tbl (col varchar(255));
insert into tbl (col) values ('ABCDEFG'), ('HIJKLMNO'), ('PQRSTUVW'), ('XYZ');
select * from tbl where col like 'ABC%'
union
select * from tbl where col like 'XYZ%'
union
select * from tbl where col like 'PQR%';
+----------+
| col |
+----------+
| ABCDEFG |
| XYZ |
| PQRSTUVW |
+----------+
3 rows in set (0.00 sec)
select * from tbl where col like 'ABC%'
or col like 'XYZ%'
or col like 'PQR%';
이 기능은 Toad 및 PowerBuilder에서 작동합니다.나머지는 모른다.
이것은 도움이 될 수 있습니다.
select * from tbl where col like '[ABC-XYZ-PQR]%'
SQL Server 2005에서 이 기능을 사용했는데 작동했습니다.
OR을 하거나 유니언 쿼리를 작성함으로써 오퍼레이터처럼 여러 번 패스할 수 없는 조건도 있었습니다.
This worked for me in Oracle 11g:
REGEXP_LIKE (column, 'ABC.*|XYZ.*|PQR.*');
너도 해볼 수 있어
기능.
CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20))
RETURNS @Strings TABLE
(
position int IDENTITY PRIMARY KEY,
value varchar(8000)
)
AS
BEGIN
DECLARE @index int
SET @index = -1
WHILE (LEN(@text) > 0)
BEGIN
SET @index = CHARINDEX(@delimiter , @text)
IF (@index = 0) AND (LEN(@text) > 0)
BEGIN
INSERT INTO @Strings VALUES (@text)
BREAK
END
IF (@index > 1)
BEGIN
INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
ELSE
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
RETURN
END
쿼리
select * from my_table inner join (select value from fn_split('ABC,MOP',','))
as split_table on my_table.column_name like '%'+split_table.value+'%';
파라미터 값이 고정되어 있지 않거나 비즈니스에 따라 값이 null일 수 있는 경우 다음 방법을 시도해 볼 수 있습니다.
DECLARE @DrugClassstring VARCHAR(MAX);
SET @DrugClassstring = 'C3,C2'; -- You can pass null also
---------------------------------------------
IF @DrugClassstring IS NULL
SET @DrugClassstring = 'C3,C2,C4,C5,RX,OT'; -- If null you can set your all conditional case that will return for all
SELECT dn.drugclass_FK , dn.cdrugname
FROM drugname AS dn
INNER JOIN dbo.SplitString(@DrugClassstring, ',') class ON dn.drugclass_FK = class.[Name] -- SplitString is a a function
SplitString 함수
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
ALTER FUNCTION [dbo].[SplitString](@stringToSplit VARCHAR(MAX),
@delimeter CHAR(1) = ',')
RETURNS @returnList TABLE([Name] [NVARCHAR](500))
AS
BEGIN
--It's use in report sql, before any change concern to everyone
DECLARE @name NVARCHAR(255);
DECLARE @pos INT;
WHILE CHARINDEX(@delimeter, @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(@delimeter, @stringToSplit);
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1);
INSERT INTO @returnList
SELECT @name;
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos);
END;
INSERT INTO @returnList
SELECT @stringToSplit;
RETURN;
END;
덧붙여야만 했다all
아삽의 대답에 맞춰야 해
select * from tbl where col like 'ABC%'
union all
select * from tbl where col like 'XYZ%'
union all
select * from tbl where col like 'PQR%';
선택 * TBL WHERE WHERE COLKE '[0-9,a-z]%'에서 선택;
단순히 sql에서 같은 조건을 사용하면 원하는 답변을 얻을 수 있습니다.
언급URL : https://stackoverflow.com/questions/1387612/how-can-i-introduce-multiple-conditions-in-like-operator
'it-source' 카테고리의 다른 글
어레이 파괴 시 유형 (0) | 2023.02.16 |
---|---|
Chrome에서 iframe을 로드할 때 'load' 이벤트가 발생하지 않음 (0) | 2023.02.16 |
파라미터를 jQuery의 .load()에 전달하는 가장 좋은 방법 (0) | 2023.02.16 |
Spring @ReponseBody @RequestBody(추상 클래스 포함) (0) | 2023.02.16 |
spring에서 2개 이상의 데이터베이스를 사용하는 방법 (0) | 2023.02.12 |