选择在每个' /'之后连接第一个字符的语句列中的字符

时间:2014-07-11 18:21:21

标签: sql sql-server tsql

所以我正在尝试编写一个查询,除其他外,它会返回Varchar字段中的第一个字符,然后返回在每个/字符后面显示的第一个字符。

我正在重写的字段将包含一组姓氏,用'/'分隔。例如: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列。

谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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