programing

SQL Server에서 특정 문자 뒤와 앞에 있는 모든 항목 가져오기

abcjava 2023. 4. 26. 22:52
반응형

SQL Server에서 특정 문자 뒤와 앞에 있는 모든 항목 가져오기

데이터베이스에 다음 항목이 있습니다.

images/test.jpg

항목을 다듬어 다음과 같은 작업을 수행합니다.test

그래서 기본적으로, 나는 모든 것을 그 후에 원합니다./그 이전에.

어떻게 해결해야 하나요?

다음 기능을 사용합니다.

left(@test, charindex('/', @test) - 1)

SQL을 사용하여 테이블에서 이 기능을 제거하려면 다음과 같은 기능을 사용하여 항목을 트리밍할 수 있습니다.

가능한 쿼리는 다음과 같습니다(위치).col이미지 디렉토리가 들어 있는 열의 이름입니다.

SELECT SUBSTRING(col, LEN(SUBSTRING(col, 0, LEN(col) - CHARINDEX ('/', col))) + 1, 
    LEN(col) - LEN(SUBSTRING(col, 0, LEN(col) - CHARINDEX ('/', col))) - LEN(SUBSTRING(
    col, CHARINDEX ('.', col), LEN(col))));

약간 못생긴 짐승.또한 표준 형식인 'dir/name.ext'에 따라 달라집니다.

편집:
이것(praveen에서 영감을 받은)은 더 일반적이며 다양한 길이의 확장을 다룹니다.

SELECT SUBSTRING(col, LEN(LEFT(col, CHARINDEX ('/', col))) + 1, LEN(col) - LEN(LEFT(col, 
    CHARINDEX ('/', col))) - LEN(RIGHT(col, LEN(col) - CHARINDEX ('.', col))) - 1);

전에

SELECT SUBSTRING(ParentBGBU,0,CHARINDEX('/',ParentBGBU,0)) FROM dbo.tblHCMMaster;

끝나고

SELECT SUBSTRING(ParentBGBU,CHARINDEX('-',ParentBGBU)+1,LEN(ParentBGBU)) FROM dbo.tblHCMMaster

----앞에 /를 포함하여 문자 선택

select SUBSTRING ('abcde/wxyz',0,CHARINDEX('/','abcde/wxyz')+1)

--뒤에 /를 포함한 문자 선택

select SUBSTRING('abcde/wxyz',CHARINDEX('/','abcde/wxyz'),LEN('abcde/wxyz')) 
 declare @T table
  (
  Col varchar(20)
  )



  insert into @T 
  Select 'images/test1.jpg'
  union all
  Select 'images/test2.png'
  union all
  Select 'images/test3.jpg'
  union all
  Select 'images/test4.jpeg'
  union all
  Select 'images/test5.jpeg'

 Select substring( LEFT(Col,charindex('.',Col)-1),charindex('/',Col)+1,len(LEFT(Col,charindex('.',Col)-1))-1 )
from @T

저는 훨씬 더 일반적인 방법을 만들었습니다.

그래서 :

DECLARE @a NVARCHAR(MAX)='images/test.jpg';


 --Touch here
DECLARE @keysValueToSearch NVARCHAR(4000) = '/'
DECLARE @untilThisCharAppears NVARCHAR(4000) = '.'
DECLARE @keysValueToSearchPattern NVARCHAR(4000) = '%' + @keysValueToSearch + '%'


 --Nothing to touch here     
SELECT SUBSTRING(
           @a,
           PATINDEX(@keysValueToSearchPattern, @a) + LEN(@keysValueToSearch),
           CHARINDEX(
               @untilThisCharAppears,
               @a,
               PATINDEX(@keysValueToSearchPattern, @a) + LEN(@keysValueToSearch)
           ) -(PATINDEX(@keysValueToSearchPattern, @a) + LEN(@keysValueToSearch))
       )
SELECT Substring('ravi1234@gmail.com', 1, ( Charindex('@', 'ravi1234@gmail.com')
                                            - 1 ))
       Before,
       RIGHT('ravi123@gmail.com', ( Charindex('@', 'ravi123@gmail.com') + 1 ))
       After  

저는 제 보고서 중 하나에서 이것을 했습니다. 매우 단순했습니다.

사용해 보십시오.

=MID(Fields!.Value,8,4)

참고: 제가 얻고자 했던 가치는 여러분이 얻고자 하는 것이 상수인지 확신할 수 없다는 것이었기 때문에 이것은 저에게 효과가 있었습니다.

오랜만인 거 알아요하지만 여기 아이디어가 있습니다.

declare @test varchar(25) = 'images/test.jpg'

select
 @test as column_name
 , parsename(replace(@test,'/','.'),1) as jpg
 ,parsename(replace(@test,'/','.'),2) as test
  ,parsename(replace(@test,'/','.'),3) as images

는 로이 나미르의 답변이 유용하다는 을 알았지만, 그것을 기능으로 만들기 위해 확장했습니다.제가 알기 쉬운 이름으로 변수의 이름을 바꿨지만, 원한다면 쉽게 다시 변환할 수 있습니다.

또한 Royi의 답변에 있는 코드는 이미 검색 대상 캐릭터가 존재하지 않는 경우(문자열의 처음부터 시작)를 처리했지만, 검색 대상 캐릭터가 존재하지 않는 경우도 처리하고 싶었습니다.

이 경우 검색된 문자에서 시작하여 나머지 문자를 문자열 끝으로 되돌리는 방식으로 작동합니다.

CREATE FUNCTION [dbo].[getValueBetweenTwoStrings](@inputString 
NVARCHAR(4000), @stringToSearchFrom NVARCHAR(4000), @stringToSearchTo 
NVARCHAR(4000))
RETURNS NVARCHAR(4000)
AS
BEGIN      
DECLARE @retVal NVARCHAR(4000)
DECLARE @stringToSearchFromSearchPattern NVARCHAR(4000) = '%' + 
@stringToSearchFrom + '%'

SELECT @retVal = SUBSTRING (
       @inputString,
       PATINDEX(@stringToSearchFromSearchPattern, @inputString) + LEN(@stringToSearchFrom),
       (CASE
            CHARINDEX(
                @stringToSearchTo,
                @inputString,
                PATINDEX(@stringToSearchFromSearchPattern, @inputString) + LEN(@stringToSearchFrom))
        WHEN
            0
        THEN
            LEN(@inputString) + 1
        ELSE
            CHARINDEX(
                @stringToSearchTo,
                @inputString,
                PATINDEX(@stringToSearchFromSearchPattern, @inputString) + LEN(@stringToSearchFrom))
        END) - (PATINDEX(@stringToSearchFromSearchPattern, @inputString) + LEN(@stringToSearchFrom))
   )
RETURN @retVal
END

용도:

SELECT dbo.getValueBetweenTwoStrings('images/test.jpg','/','.') AS MyResult

잘못된 길이 오류가 발생했습니다.그래서 저는 이 기능을 만들었습니다, 이것은 길이 문제를 일으키지 않을 것입니다.또한 검색된 텍스트를 찾을 수 없는 경우 NULL을 반환합니다.

CREATE FUNCTION [FN].[SearchTextGetBetweenStartAndStop](@string varchar(max),@SearchStringToStart varchar(max),@SearchStringToStop varchar(max))

RETURNS varchar(max)

BEGIN


    SET @string =    CASE 
                         WHEN CHARINDEX(@SearchStringToStart,@string) = 0
                           OR CHARINDEX(@SearchStringToStop,RIGHT(@string,LEN(@string) - CHARINDEX(@SearchStringToStart,@string) + 1 - LEN(@SearchStringToStart))) = 0
                         THEN NULL
                         ELSE SUBSTRING(@string
                                       ,CHARINDEX(@SearchStringToStart,@string) + LEN(@SearchStringToStart) + 1
                                       ,(CHARINDEX(@SearchStringToStop,RIGHT(@string,LEN(@string) - CHARINDEX(@SearchStringToStart,@string) + 1 - LEN(@SearchStringToStart)))-2)     
                                       )
                     END


    RETURN @string

END

지정된 문자가 둘 이상일 경우 다음을 사용합니다.

DECLARE @rightidx int = CASE
    WHEN 'images/images/test.jpg' IS NULL OR (CHARINDEX('.', 'images/images/test.jpg')) <= 0 THEN LEN('images/images/test.jpg')
    ELSE  (CHARINDEX('.', REVERSE('images/images/test.jpg')) - 1)
END

SELECT RIGHT('images/images/test.jpg', @rightidx)

Input= pg102a-wlc01s.png.intel.com 및 Output이 pg102a-wlc01s여야 하는 경우

아래 쿼리를 사용할 수 있습니다.

select Substring(pc.name,0,charindex('.',pc.name,0)),pc.name from tbl_name pc

사용해 볼 수 있습니다.

Declare @test varchar(100)='images/test.jpg'
Select REPLACE(RIGHT(@test,charindex('/',reverse(@test))-1),'.jpg','')

아래 쿼리는 '-' Ex-W12345A-4S 이전의 데이터를 제공합니다.

SELECT SUBSTRING(Column_Name,0, CHARINDEX('-',Column_Name))  as 'new_name'
from [abc].

출력 - W12345a

Josien의 작품에서 영감을 받아, 저는 단순화에 대해 궁금했습니다.

이것도 효과가 있을까요?훨씬 더 짧음:

SELECT SUBSTRING(col, CHARINDEX ('/', col) + 1, CHARINDEX ('.', col) - CHARINDEX ('/', col) - 1);

(회사 SQL 서버의 올바른 문제 때문에 지금 테스트할 수 없습니다. 이는 자체적으로 문제입니다.)

LEFT, RIGHT, CHARINDEX로 간단히 시도

select 
LEFT((RIGHT(a.name,((CHARINDEX('/', name))+1))),((CHARINDEX('.', (RIGHT(a.name, 
                     ((CHARINDEX('/', name))+1)))))-1)) splitstring,
a.name      
from 
   (select 'images/test.jpg' as name)a
declare @searchStart nvarchar(100) = 'search ';
declare @searchEnd nvarchar(100) = ' ';
declare @string nvarchar(4000) = 'This is a string to search (hello) in this text ';

declare @startIndex int = CHARINDEX(@searchStart, @string,0) + LEN(@searchStart);
declare @endIndex int = CHARINDEX(@searchEnd, @string, @startIndex + 1);
declare @length int = @endIndex - @startIndex;
declare @sub nvarchar(4000) = SUBSTRING(@string, @startIndex, @length)

select @startIndex, @endIndex, @length, @sub

이것은 질문에 구체적으로 대답하는 이 답변의 한 줄자보다 조금 더 읽기 쉽지만, 모든 독자에게 이익이 되는 일반적인 방식은 아닙니다.이것은 조금만 수정해도 쉽게 기능으로 만들 수 있습니다.

이것이 제가 취한 접근법이었습니다.

    CREATE FUNCTION dbo.get_text_before_char(@my_string nvarchar(255),@my_char char(1))
    RETURNS nvarchar(255)
    AS
        BEGIN;
            return IIF(@my_string LIKE '%' + @my_char + '%',left  (@my_string, IIF(charindex(@my_char, @my_string) - 1<1,1,charindex(@my_char, @my_string) - 1)),'');
        END;
    
    CREATE FUNCTION dbo.get_text_after_char(@my_string nvarchar(255),@my_char char(1))
        RETURNS nvarchar(255)
    AS
    BEGIN;
       return IIF ( @my_string LIKE '%' + @my_char + '%' ,RIGHT ( @my_string , IIF ( charindex ( @my_char ,reverse(@my_string) )-1 < 1 ,1 ,charindex ( @my_char ,reverse(@my_string) )-1 ) ) , '' )
    END;
    
    SELECT
          dbo.get_text_before_char('foo-bar','-')
        , dbo.get_text_after_char('foo-bar','-')
declare @test varchar(100)='images/test.jpg'
select right(left(@test, charindex('.', @test) - 1),4)

첫 번째 부품에는 다음을 사용합니다.

SELECT LEFT(@test, CASE CHARINDEX('/', @test)-1 WHEN -1 THEN LEN(@test) ELSE CHARINDEX('/', @test)-1 END) 

언급URL : https://stackoverflow.com/questions/11010453/get-everything-after-and-before-certain-character-in-sql-server

반응형