programing

SQL LIKE와 IN을 함께 사용

prostudy 2022. 9. 19. 23:19
반응형

SQL LIKE와 IN을 함께 사용

LIKE와 IN을 함께 사용할 수 있는 방법이 있나요?

나는 이런 것을 이루고 싶다.

SELECT * FROM tablename WHERE column IN ('M510%', 'M615%', 'M515%', 'M612%');

따라서 기본적으로 열을 여러 문자열과 일치시킬 수 있어야 합니다.하나의 쿼리로 이 작업을 수행하는 다른 방법이 있습니까?아니면 찾고 있는 문자열 배열을 루프해야 합니까?

IN과 함께 서브스트링을 사용하면 어떨까요?

select * from tablename where substring(column,1,4) IN ('M510','M615','M515','M612')

개개의 LIKE와 OR을 조합하는 것으로, 1개의 쿼리로 실행할 수 있습니다.

SELECT * FROM tablename
WHERE column LIKE 'M510%'
OR    column LIKE 'M615%'
OR    column LIKE 'M515%'
OR    column LIKE 'M612%';

LIKE나 행 단위 함수 등의 기능이 항상 잘 확장되는 것은 아닙니다.테이블이 커질 것 같으면 테이블에 다른 열을 추가하여 필드의 처음 4개 문자를 개별적으로 저장하는 것을 고려할 수 있습니다.

이렇게 하면 데이터가 중복되지만 삽입 및 업데이트 트리거를 사용하여 일관성을 유지할 수 있습니다.그런 다음 새 열에 인덱스를 붙이면 쿼리가 다음과 같이 됩니다.

SELECT * FROM tablename WHERE newcolumn IN ('M510','M615','M515','M612');

이렇게 하면 매번 데이터를 읽을 때마다 계산 비용이 필요하지 않고 데이터가 변경될 때 필요한 지점으로 이동합니다.실제로 새로운 열은 4가지 특수 유형 중 하나임을 나타내는 부울(Boolean)로 사용할 수 있습니다(특수 그룹이 자주 변경되지 않는 경우).그러면 쿼리가 훨씬 더 빨라집니다.

SELECT * FROM tablename WHERE is_special = 1;

이러한 스토리지 요건과 속도의 트레이드오프는 대규모 데이터베이스에 도움이 됩니다.일반적으로 디스크 공간은 저렴하고 CPU는 소중하며 데이터를 쓰는 것보다 읽는 빈도가 훨씬 높습니다.계산 비용을 쓰기 단계로 이동하면 모든 읽기에 걸쳐 비용을 상각할 수 있습니다.

여러 개를 LIKE with 、 " " " 。OR.

OR 묶음인 IN의 긴 버전을 사용합니다.

SELECT * FROM tablename 
WHERE column LIKE 'M510%'
OR column LIKE 'M615%'
OR column LIKE 'M515%'
OR column LIKE 'M612%';
SELECT * FROM tablename
  WHERE column IN 
    (select column from  tablename 
    where column like 'M510%' 
    or column like 'M615%' 
    OR column like 'M515%' 
    or column like'M612%'
    )
substr([column name],
       [desired starting position (numeric)],
       [# characters to include (numeric)]) in ([complete as usual])

substr([column name],1,4) in ('M510','M615', 'M515', 'M612')

나는 다른 방법을 시도했다.

테이블에 값이 있다고 가정합니다.


    1   M510
    2   M615
    3   M515
    4   M612
    5   M510MM
    6   M615NN
    7   M515OO
    8   M612PP
    9   A
    10  B
    11  C
    12  D

여기서 콜 1~8은 유효하지만 나머지 콜은 무효입니다.


  SELECT COL_VAL
    FROM SO_LIKE_TABLE SLT
   WHERE (SELECT DECODE(SUM(CASE
                              WHEN INSTR(SLT.COL_VAL, COLUMN_VALUE) > 0 THEN
                               1
                              ELSE
                               0
                            END),
                        0,
                        'FALSE',
                        'TRUE')
            FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('M510', 'M615', 'M515', 'M612'))) =
         'TRUE'

INSTR 함수를 사용하여 검색한 것은 테이블 매치 내의 값 중 하나를 입력으로 하는 것입니다.이 경우 ZERO보다 큰 인덱스를 반환합니다.테이블의 값이 입력과 일치하지 않을 경우 ZERO를 반환합니다.이 인덱스는 성공적인 일치를 나타내기 위해 합산한 것입니다.

효과가 있는 것 같아요.

도움이 됐으면 좋겠다.

와일드카드와 함께 서브쿼리를 사용할 수 있습니다.

 SELECT 'Valid Expression'
 WHERE 'Source Column' LIKE (SELECT '%Column' --FROM TABLE)

또는 단일 문자열을 사용할 수 있습니다.

 SELECT 'Valid Expression'
 WHERE 'Source Column' LIKE ('%Source%' + '%Column%')

이것까지 시도해 볼 수 있다.

기능.

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('M510', 'M615', 'M515', 'M612',','))
as split_table on my_table.column_name like '%'+split_table.value+'%';

완전히 동적인 솔루션에서는 커서와 온도 테이블을 조합하여 이를 달성할 수 있습니다.이 솔루션에서는 시작 위치나 길이를 알 필요가 없으며 SQL 쿼리에 OR을 추가하지 않고도 확장할 수 있습니다.

이 예에서는 특정 텍스트 목록이 '상세' 안에 있는 테이블에서 ID, 세부 정보 및 작성 날짜를 선택한다고 가정합니다.

먼저 검색 문자열이 포함된 테이블 FilterTable을 Search라는 열에 만듭니다.

질문 시작자가 요청한 대로:

insert into [DATABASE].dbo.FilterTable
select 'M510' union
select 'M615' union
select 'M515' union 
select 'M612'

그런 다음 다음과 같이 데이터를 필터링할 수 있습니다.

DECLARE @DATA NVARCHAR(MAX)

CREATE TABLE #Result (ID uniqueIdentifier, Details nvarchar(MAX), Created datetime)

DECLARE DataCursor CURSOR local forward_only FOR  
SELECT '%' + Search + '%'
FROM [DATABASE].dbo.FilterTable

OPEN DataCursor   
FETCH NEXT FROM DataCursor INTO @DATA   

WHILE @@FETCH_STATUS = 0   
BEGIN   

    insert into #Result
        select ID, Details, Created
        from [DATABASE].dbo.Table (nolock)
        where Details like @DATA

   FETCH NEXT FROM DataCursor INTO @DATA   
END   

CLOSE DataCursor   
DEALLOCATE DataCursor 

select * from #Result
drop table #Result

도움이 됐으면 좋겠다

select * 
from tablename
where regexp_like (column, '^M510|M615|^M515|^M612')

주의: 이 방법은 코드 M615가 컬럼 중앙에 있을 때 일치하도록 해도 작동합니다.나머지 코드는 열이 이 코드로 시작하는 경우에만 일치합니다.

언급URL : https://stackoverflow.com/questions/2318126/using-sql-like-and-in-together

반응형