2014-07-11 2 views
0

그래서 Varchar 필드의 첫 번째 문자를 가져 오는 쿼리를 작성하려고 시도하는 중 첫 번째 문자가 반환됩니다 필드의 나머지 부분에서 각/문자 후.열의 모든 '/'문자 다음에 첫 번째 문자를 연결하는 명령문

내가 다시 회신하는 입력란에는 '/'로 구분 된 성의 그룹이 포함됩니다. 예를 들면 다음과 같습니다. Fischer-Costello/Korbell/Morrison/Pearson

위 예제의 경우 select 문에서 FKMP를 반환합니다.

지금까지 나는 첫 번째 문자 + 첫 번째 문자 (첫 번째 문자 만) '/'문자 다음에 코드를 반환 할 수있었습니다.

따라서 위의 예 입력을, 내 선택 문은 반환 : FK

을 여기

내가 지금까지 작성한 코드입니다 : 코드를 읽으면

select rp.CONTACT_ID, ra.TRADE_REP, c.FIRST_NAME, c.LAST_NAME, 
UPPER(LEFT(FIRST_NAME, 1)) + SUBSTRING(c.first_name,CHARINDEX('/',c.first_name)+1,1) as al_1, 
UPPER(LEFT(LAST_NAME, 1)) + SUBSTRING(c.LAST_name,CHARINDEX('/',c.LAST_name)+1,1) as al_2 


from dbo.REP_ALIAS ra 
inner join dbo.REP_PROFILE rp on rp.CONTACT_ID = ra.CONTACT_ID 
inner join dbo.CONTACT c on rp.CONTACT_ID = c.CONTACT_ID 

where 
rp.CRD_NUMBER is null and 
ra.TRADE_REP like '%DNK%' and 
(c.LAST_NAME like '%/%' or c.FIRST_NAME like '%/%') and 
ra.TRADE_FIRM in 
(
'xxxxxxx', 
'xxxxxxx' 
) 

, 그것은 분명의 I first_name 열에서도 동일한 연결을 수행하려고합니다. 그러나, 나는 Last_name 열 (내 예제에서 사용)에 대한 솔루션이 first_name 열에서도 작동한다는 것을 알고 있습니다.

감사합니다.

+0

성 필드의 데이터는 항상 네 개의 이름으로 구성되며 세 개의 슬래시로 구분됩니까? – DMason

+0

아니요, 이름 수는 새로운 레코드마다 달라집니다. – FluffyKittens

+1

여러 개의 이름이 단일 열에 저장되지 않도록 디자인을 수정해야합니다. –

답변

0

일부 기본값

DECLARE @List VARCHAR(50) = 'Fischer-Costello/Korbell/Morrison/Pearson' 
DECLARE @SplitOn CHAR(1) = '/' 

이 영역은

DECLARE @RtnValue table 
(
    Id int identity(1,1), 
    Value nvarchar(4000) 
) 

While (Charindex(@SplitOn, @List)>0) 
Begin 

Insert Into @RtnValue (value) 
Select 
    Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1))) 

    Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn+',')-1,len(@List)) 
End 

Insert Into @RtnValue (Value) 
Select Value = ltrim(rtrim(@List)) 

가 이제 다시 하나의 변수

에 각각의 이름과 물건의 첫 번째 문자를 잡을 수있는 목록에 문자열을 분할
SELECT STUFF((SELECT SUBSTRING(VALUE,1,1) FROM @RtnValue FOR XML PATH('')),1,0,'') AS Value 

출력 :

Value 
FKMP 
+0

난 그냥 분할 함수를 작성한 다음 마지막 호출에서 인라인으로 호출하여 테이블에서 직접 데이터를 채 웁니다. –

+0

여기에서 문제는 루핑입니다. 이것을 분할 기능으로 바꾸는 것조차 루프를 사용하고 있습니다. 그 의미는 천천히 !!! –

+0

감사합니다. 이것은 주어진 문자열에 유용합니다. 하지만 솔직히 말해서 [성에 의해 분리 된 성]의 전체 열과 함께 작동하도록 수정하는 방법을 잘 모르겠습니다. EDIT-이 기능을 원래 쿼리에서 사용되는 함수로 바꾸려는 의도였습니다. 좋은 생각, 도와 줘서 고마워! – FluffyKittens

0

이 작업을 수행하는 또 다른 방법은 루핑보다 훨씬 빠릅니다. 필요한 것은 세트 기반 스플리터입니다. SQL 서버 중앙의 Jeff Moden은 멋진 서버를 가지고 있습니다. 다음은 기사 링크입니다. http://www.sqlservercentral.com/articles/Tally+Table/72993/

이제 계정을 보려면 가입해야하지만 무료이며 해당 기사의 논리가 데이터를 보는 방식을 바꿀 것입니다. DelimitedSplit8K를 검색하면 게시 된 코드를 찾을 수도 있습니다.

여하튼이 유형의 스플리터를 구현하는 방법은 다음과 같습니다.

declare @Table table(ID int identity, SomeValue varchar(50)) 

insert @Table 
select 'Fischer-Costello/Korbell/Morrison/Pearson' 

select ID, STUFF((select '' + left(x.Item, 1) 
    from @Table t2 
    cross apply dbo.DelimitedSplit8K(SomeValue, '/') x 
    where t2.ID = t1.ID 
    for xml path('')), 1, 0 , '') as MyResult 
from @Table t1 
group by t1.ID 
관련 문제