2014-07-11 33 views
0

因此,我正在尝试编写一个查询,其中包括将Varchar字段中的第一个字符返回,然后返回出现的第一个字符在整个场地的每个角色之后。选择连接列中每个'/'字符后的第一个字符的语句

我也正在refrering的字段将包含一组姓氏,用'/'分隔。例如:Fischer-Costello/Korbell/Morrison/Pearson

对于上面的例子,我希望我的select语句返回:FKMP。

到目前为止,我只能让我的代码返回第一个字符+第一个字符后面的第一个字符(也只是第一个)。

因此,对于上面的例子中输入,我的select语句将返回: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' 
) 

如果您阅读代码,很明显,我我也尝试在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

谢谢,这对于给定的字符串很有用。但我真的不知道如何修改它来处理整个列[由[/]隔开的姓氏]编辑 - 我知道你的意思是把它变成一个函数,用于我原来的查询。好主意,感谢您的帮助! – FluffyKittens

0

这样做的另一种方法是比循环快很多。你需要的是一套基于分离器。在sql server central的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 
相关问题