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
'programing' 카테고리의 다른 글
asp.net :차트 핸들러 구성 [c:\TempImageFiles\] (0) | 2023.04.26 |
---|---|
Swift에서 객체의 유형을 어떻게 알 수 있습니까? (0) | 2023.04.26 |
Git에서 대소문자를 구분하는 파일 이름만 변경하려면 어떻게 해야 합니까? (0) | 2023.04.26 |
콘솔 출력을 반향하여 배트 스크립트의 파일로 전송하려면 어떻게 해야 합니까? (0) | 2023.04.26 |
Excel VBA에 폴더 및 하위 폴더 만들기 (0) | 2023.04.26 |