Programing

LIKE 연산자에서 여러 조건을 어떻게 도입 할 수 있습니까?

lottogame 2020. 11. 14. 09:46
반응형

LIKE 연산자에서 여러 조건을 어떻게 도입 할 수 있습니까?


다음과 같은 SQL 문을 작성하고 싶습니다.

select * from tbl where col like ('ABC%','XYZ%','PQR%');

나는 그것을 사용하여 할 수 있다는 것을 안다 OR. 그러나 더 나은 해결책이 있는지 알고 싶습니다.


다른 방법은 다음과 같습니다.

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)

이것은 임시 테이블을 잘 사용합니다.

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_REPLACE
  • 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%'
or col like 'XYZ%'
or col like 'PQR%';

이것은 두꺼비와 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;

SELECT * From tbl WHERE col LIKE '[0-9, az] %';

단순히이 조건을 SQL에서 사용하면 원하는 답변을 얻을 수 있습니다.

참고 URL : https://stackoverflow.com/questions/1387612/how-can-i-introduce-multiple-conditions-in-like-operator

반응형