programing

알려진 두 문자열 사이의 문자열을 선택하는 SQL 쿼리

topblog 2023. 11. 4. 09:48
반응형

알려진 두 문자열 사이의 문자열을 선택하는 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&parameter=1&listing=No이 형식에 필요합니다.

사용자 정의 함수를 만들어 다음과 같은 가정을 통해 문자열을 완성했습니다.

  1. 시작 발생이 발견되지 않을 경우, aNULL반환되며,
  2. 종료가 발생하지 않으면 나머지 문자열이 반환됩니다.

코드는 다음과 같습니다.

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() 기능이 필요할 것 같습니다.이 내용을 확인해 보십시오.

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_FILE2번째와 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

반응형