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
'programing' 카테고리의 다른 글
관찰 가능한 목록 결합 후 모두 완료될 때까지 기다립니다. (0) | 2022.09.19 |
---|---|
#1273 – 불명확한 대조: 'utf8mb4_unicode_520_ci' (0) | 2022.09.19 |
Debian 10 MariaDB '소켓 '/var/run/mysqld/mysqld를 통해 로컬 MySQL 서버에 연결할 수 없습니다.양말' (2)' (0) | 2022.09.19 |
변수가 null이 아닌지 확인하는 방법 (0) | 2022.09.19 |
특정 서브스트링 뒤에 문자열을 얻는 방법 (0) | 2022.09.19 |