알려진 두 문자열 사이의 문자열을 선택하는 SQL 쿼리
알려진 두 문자열 사이의 값을 얻으려면 SQL 쿼리가 필요합니다(반환된 값은 이 두 문자열로 시작하고 종료해야 함).
예를 들어요.
"제가 아는 것은 개가 매우 나빠서 다른 사람들이 어떻게 생각하든 간에 즉시 가혹한 처벌을 요구했다는 것뿐이었습니다."
이 경우 알려진 문자열은 "the dog"와 "즉시"입니다.그래서 제 질문은 "개가 매우 나빴고 즉시 가혹한 처벌이 필요했다"는 것입니다.
지금까지 생각해냈지만 소용이 없었습니다.
SELECT SUBSTRING(@Text, CHARINDEX('the dog', @Text), CHARINDEX('immediately', @Text))
@텍스트는 주 문자열을 포함하는 변수입니다.
누가 제가 어디가 잘못되고 있는지 도와주실 수 있나요?
문제는 부분 문자열 인수의 두 번째 부분이 첫 번째 색인을 포함하고 있다는 것입니다.이 작업을 수행하려면 두 번째 인덱스에서 첫 번째 인덱스를 빼야 합니다.
SELECT SUBSTRING(@Text, CHARINDEX('the dog', @Text)
, CHARINDEX('immediately',@text) - CHARINDEX('the dog', @Text) + Len('immediately'))
에반의 뜻은 이렇습니다.
SELECT SUBSTRING(@Text, CHARINDEX(@First, @Text) + LEN(@First),
CHARINDEX(@Second, @Text) - CHARINDEX(@First, @Text) - LEN(@First))
예를 들면 다음과 같습니다.문자열과 $라는 문자가 있습니다.
문자열:
aaaaa$bbbbb$ccccc
코드:
SELECT SUBSTRING('aaaaa$bbbbb$ccccc',CHARINDEX('$','aaaaa$bbbbb$ccccc')+1, CHARINDEX('$','aaaaa$bbbbb$ccccc',CHARINDEX('$','aaaaa$bbbbb$ccccc')+1) -CHARINDEX('$','aaaaa$bbbbb$ccccc')-1) as My_String
출력:
bbbbb
서브스트링에서 길이 조절이 필요합니다. '끝줄' 끝을 가리키고 계셨습니다.
다음과 같은 것을 시도해 보십시오.
declare @TEXT varchar(200)
declare @ST varchar(200)
declare @EN varchar(200)
set @ST = 'the dog'
set @EN = 'immediately'
set @TEXT = 'All I knew was that the dog had been very bad and required harsh punishment immediately regardless of what anyone else thought.'
SELECT SUBSTRING(@Text, CHARINDEX(@ST, @Text), (CHARINDEX(@EN, @Text)+LEN(@EN))-CHARINDEX(@ST, @Text))
물론 조금 조정이 필요할 수도 있습니다.
IIS 로그의 csUriQuery 필드에 저장된 매개 변수 집합을 구문 분석해야 하는 것과 유사한 필요가 있었습니다. 이는 다음과 같습니다.id=3598308&user=AD\user¶meter=1&listing=No
이 형식에 필요합니다.
사용자 정의 함수를 만들어 다음과 같은 가정을 통해 문자열을 완성했습니다.
- 시작 발생이 발견되지 않을 경우, a
NULL
반환되며, - 종료가 발생하지 않으면 나머지 문자열이 반환됩니다.
코드는 다음과 같습니다.
CREATE FUNCTION dbo.str_between(@col varchar(max), @start varchar(50), @end varchar(50))
RETURNS varchar(max)
WITH EXECUTE AS CALLER
AS
BEGIN
RETURN substring(@col, charindex(@start, @col) + len(@start),
isnull(nullif(charindex(@end, stuff(@col, 1, charindex(@start, @col)-1, '')),0),
len(stuff(@col, 1, charindex(@start, @col)-1, ''))+1) - len(@start)-1);
END;
GO
위의 질문에 대한 용법은 다음과 같습니다.
DECLARE @a VARCHAR(MAX) = 'All I knew was that the dog had been very bad and required harsh punishment immediately regardless of what anyone else thought.'
SELECT dbo.str_between(@a, 'the dog', 'immediately')
-- Yields' had been very bad and required harsh punishment '
이렇게 해보고 '[' & ']'를 문자열로 바꿉니다.
SELECT SUBSTRING(@TEXT,CHARINDEX('[',@TEXT)+1,(CHARINDEX(']',@TEXT)-CHARINDEX('[',@TEXT))-1)
SQL Server의 PATINDEX() 기능이 필요할 것 같습니다.이 내용을 확인해 보십시오.
그래서 어쩌면:
SELECT SUBSTRING(@TEXT, PATINDEX('%the dog%', @TEXT), PATINDEX('%immediately%',@TEXT))
SELECT
SUBSTRING( '123@yahoo.com', charindex('@','123@yahoo.com',1) + 1, charindex('.','123@yahoo.com',1) - charindex('@','123@yahoo.com',1) - 1 )
DECLARE @Text VARCHAR(MAX), @First VARCHAR(MAX), @Second VARCHAR(MAX)
SET @Text = 'All I knew was that the dog had been very bad and required harsh punishment immediately regardless of what anyone else thought.'
SET @First = 'the dog'
SET @Second = 'immediately'
SELECT SUBSTRING(@Text, CHARINDEX(@First, @Text),
CHARINDEX(@Second, @Text) - CHARINDEX(@First, @Text) + LEN(@Second))
당신은 '즉시 처벌'이라는 시작 위치를 얻지만, 그것을 하위 문자열의 길이 매개 변수로 전달합니다.
'즉시 처벌'의 문자 색인에서 '개'의 시작 위치를 뺀 다음 '즉시 처벌' 문자열의 길이를 세 번째 매개 변수에 추가해야 합니다.그러면 정확한 텍스트가 표시됩니다.
다음은 이 과정을 설명하기 위한 거칠고 해킹성 코드입니다.
DECLARE @text VARCHAR(MAX)
SET @text = 'All I knew was that the dog had been very bad and required harsh punishment immediately regardless of what anyone else thought.'
DECLARE @start INT
SELECT @start = CHARINDEX('the dog',@text)
DECLARE @endLen INT
SELECT @endLen = LEN('immediately')
DECLARE @end INT
SELECT @end = CHARINDEX('immediately',@text)
SET @end = @end - @start + @endLen
SELECT @end
SELECT SUBSTRING(@text,@start,@end)
결과: 개는 매우 나빴고 즉시 가혹한 처벌이 필요했습니다.
여러 가지 옵션 중 하나는 간단한 함수를 만드는 것입니다.코드를 더 깨끗하게 유지할 수 있습니다.시작 또는 종료 마커/스트링이 없는 경우 오류를 처리할 수 있는 기능을 제공합니다.또한 이 기능을 사용하면 선행 또는 후행 공백을 옵션으로 트리밍할 수 있습니다.
dbo를 선택합니다.GetStringBetweenMarkers('123456789', '234', '78', 0, 1)
수율:
56
--Code to create the function
USE [xxxx_YourDB_xxxx]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[GetStringBetweenMarkers] (@FullString varchar(max), @StartMarker varchar(500), @EndMarker varchar(500), @TrimLRWhiteSpace bit, @ReportErrorInResult bit)
RETURNS varchar(max)
AS
BEGIN
--Purpose is to simply return the string between 2 string markers. ew 2022-11-06
--Will perform a LTRIM and RTRIM if @TrimLRWhiteSpace = 1
--Will report errors of either marker not being found in the RETURNed string if @ReportErrorInResult = 1.
-- When @ReportErrorInResult = 0, if the start marker isn't found, will return everything from the start of the @FullString to the left of the end marker.
-- When @ReportErrorInResult = 0, if the end marker isn't found, SQL will return an error of "Invalid length parameter passed to the LEFT or SUBSTRING function."
DECLARE @ReturnString VARCHAR(max) = ''
DECLARE @StartOfStartMarker INT = CHARINDEX(@StartMarker, @FullString)
DECLARE @StartOfTarget INT = CHARINDEX(@StartMarker, @FullString) + LEN(@StartMarker)
DECLARE @EndOfTarget INT = CHARINDEX(@EndMarker, @FullString, @StartOfTarget)
--If a marker wasn't found, put that into the
IF @ReportErrorInResult = 1
BEGIN
IF @EndOfTarget = 0 SET @ReturnString = '[ERROR: EndMarker not found.]'
IF @StartOfStartMarker = 0 SET @ReturnString = '[ERROR: StartMarker not found.]'
IF @StartOfStartMarker = 0 AND @EndOfTarget = 0 SET @ReturnString = '[ERROR: Both StartMarker and EndMarker not found.]'
END
--If not reporting errors, and start marker not found (i.e. CHARINDEX = 0) we would start our string at the LEN(@StartMarker).
-- This would give an odd result. Best to just provide from 0, i.e. the start of the @FullString.
IF @ReportErrorInResult = 0 AND @StartOfStartMarker = 0 SET @StartOfTarget = 0
--Main action
IF @ReturnString = '' SET @ReturnString = SUBSTRING(@FullString, @StartOfTarget, @EndOfTarget - @StartOfTarget)
IF @TrimLRWhiteSpace = 1 SET @ReturnString = LTRIM(RTRIM(@ReturnString))
RETURN @ReturnString
--Examples
-- SELECT '>' + dbo.GetStringBetweenMarkers('123456789','234','78',0,1) + '<' AS 'Result-Returns what is in between markers w/ white space'
-- SELECT '>' + dbo.GetStringBetweenMarkers('1234 56 789','234','78',0,1) + '<' AS 'Result-Without trimming white space'
-- SELECT '>' + dbo.GetStringBetweenMarkers('1234 56 789','234','78',1,1) + '<' AS 'Result-Will trim white space with a @TrimLRWhiteSpace = 1'
-- SELECT '>' + dbo.GetStringBetweenMarkers('abcdefgh','ABC','FG',0,1) + '<' AS 'Result-Not Case Sensitive'
-- SELECT '>' + dbo.GetStringBetweenMarkers('abc_de_fgh','_','_',0,1) + '<' AS 'Result-Using the same marker for start and end'
--Errors are returned if start or end marker are not found
-- SELECT '>' + dbo.GetStringBetweenMarkers('1234 56789','zz','78',0,1) + '<' AS 'Result-Start not found'
-- SELECT '>' + dbo.GetStringBetweenMarkers('1234 56789','234','zz',0,1) + '<' AS 'Result-End not found'
-- SELECT '>' + dbo.GetStringBetweenMarkers('1234 56789','zz','zz',0,1) + '<' AS 'Result-Niether found'
--If @ReportErrorInResult = 0
-- SELECT '>' + dbo.GetStringBetweenMarkers('123456789','zz','78',0,0) + '<' AS 'Result-Start not found-Returns from the start of the @FullString'
-- SELECT '>' + dbo.GetStringBetweenMarkers('123456789','34','zz',0,0) + '<' AS 'Result-End found-should get "Invalid length parameter passed to the LEFT or SUBSTRING function."'
END
GO
SELECT SUBSTRING('aaaaa$bbbbb$ccccc',instr('aaaaa$bbbbb$ccccc','$',1,1)+1, instr('aaaaa$bbbbb$ccccc','$',1,2)-1) -instr('aaaaa$bbbbb$ccccc','$',1,1)) as My_String
이것이 도움이 되기를 바랍니다: 변수를 선언합니다. 변경해야 할 경우에는 한 번만 변경할 수 있습니다.
declare @line varchar(100)
set @line ='Email_i-Julie@mail.com'
select SUBSTRING(@line ,(charindex('-',@line)+1), CHARINDEX('@',@line)-charindex('-',@line)-1)
(099) 0000111-> (099) | 0000111을 두 개의 다른 열처럼 구해야 했습니다.
SELECT
SUBSTRING(Phone, CHARINDEX('(', Phone) + 0, (2 + ((LEN(Phone)) - CHARINDEX(')', REVERSE(Phone))) - CHARINDEX('(', Phone))) AS CodePhone,
LTRIM(SUBSTRING(Phone, CHARINDEX(')', Phone) + 1, LEN(Phone))) AS NumberPhone
FROM
Suppliers
WHERE
Phone LIKE '%(%)%'
DECLARE @text VARCHAR(MAX)
SET @text = 'All I knew was that the dog had been very bad and required harsh punishment immediately regardless of what anyone else thought.'
DECLARE @pretext AS nvarchar(100) = 'the dog'
DECLARE @posttext AS nvarchar(100) = 'immediately'
SELECT
CASE
WHEN CHARINDEX(@posttext, @Text) - (CHARINDEX(@pretext, @Text) + len(@pretext)) < 0
THEN ''
ELSE SUBSTRING(@Text,
CHARINDEX(@pretext, @Text) + LEN(@pretext),
CHARINDEX(@posttext, @Text) - (CHARINDEX(@pretext, @Text) + LEN(@pretext)))
END AS betweentext
나는 몇 년 뒤쳐져 있지만, 캐릭터들 사이의 끈을 얻기 위해 한 일은 여기 있습니다. 그것들은 같지 않고 당신이 엔딩 캐릭터를 찾지 못하는 경우에도 여전히 당신에게 하위 문자열을 주기 위해.
BEGIN
DECLARE @TEXT AS VARCHAR(20)
SET @TEXT='E101465445454-1'
SELECT SUBSTRING(@TEXT, CHARINDEX('E', @TEXT)+1, CHARINDEX('-',@TEXT)) as 'STR',
CAST(CHARINDEX('E', @TEXT)+1 AS INT) as 'val1', CAST(CHARINDEX('-', @TEXT) AS INT) as 'val2',
(CAST(CHARINDEX('-',@TEXT) AS INT) - CAST(CHARINDEX('E',@TEXT)+1 AS INT)) as 'SUBTR', LEN(@TEXT) as 'LEN'
SELECT CASE WHEN (CHARINDEX('-', @TEXT) > 0) THEN
SUBSTRING(@TEXT, CHARINDEX('E', @TEXT)+1, (CAST(CHARINDEX('-',@TEXT) AS INT) - CAST(CHARINDEX('E',@TEXT)+1 AS INT)))
ELSE
SUBSTRING(@TEXT, CHARINDEX('E', @TEXT)+1,LEN(@TEXT)- CHARINDEX('E', @TEXT))
END
END
개선 사항이나 효과가 있는지 확인해 보십시오.
select substring(@string,charindex('@first',@string)+1,charindex('@second',@string)-(charindex('@first',@string)+1))
우리에게 줄이 있다고 생각해 봅시다.DUMMY_DATA_CODE_FILE
2번째와 3번째 밑줄(_) 사이의 부분 문자열을 찾고자 합니다.그런 다음 쿼리를 사용합니다.
select SUBSTRING('DUMMY_DATA_CODE_FILE',charindex('_', 'DUMMY_DATA_CODE_FILE', (charindex('_','DUMMY_DATA_CODE_FILE', 1))+1)+1, (charindex('_', 'DUMMY_DATA_CODE_FILE', (charindex('_','DUMMY_DATA_CODE_FILE', (charindex('_','DUMMY_DATA_CODE_FILE', 1))+1))+1)- charindex('_', 'DUMMY_DATA_CODE_FILE', (charindex('_','DUMMY_DATA_CODE_FILE', 1))+1)-1)) as Code
언급URL : https://stackoverflow.com/questions/18362260/a-sql-query-to-select-a-string-between-two-known-strings
'programing' 카테고리의 다른 글
C파일 정리 (0) | 2023.11.04 |
---|---|
'utf8' 코덱이 바이트 0 xf3을 디코딩할 수 없습니다. (0) | 2023.11.04 |
추가 문자 입력 금지 (0) | 2023.11.04 |
JPA 2.1 / 최대 절전 모드 4를 사용하여 저장 프로시저에 값 목록 전달 (0) | 2023.11.04 |
html 웹 페이지의 모든 요소에 대해 글꼴 속성을 지정하는 방법은 무엇입니까? (0) | 2023.11.04 |