TSQL函数两个新的列的子字符串

时间:2018-08-20 07:06:14

标签: sql tsql substring

使用T-Sql,我需要从一列中获取子字符串(title1)并将其移至另一列,然后将第二个子字符串(title2)除以''并移至其自己的列中。我正在考虑使用类似于mysqls的SUBSTRING_INDEX的方法,但是在TSQL中找不到其别名...

编辑:

实际上有点复杂,因为我需要将第一个子字符串与一个列表进行比较,如果存在,则将该标题移到适当的列,然后跳转到其他子字符串并执行相同的操作。

我正在使用MSSMS

说明和可能的变化(title1属于其列,反之亦然):

------
col1      
------
mr. MA.
mrs. MS.   
mr.           

miss
BA.      
MA.

我想要以下结果

------------------
title1   title2   
------------------
mr.       MA.  
mrs.      MS.
mr.         

miss         
          BA.
          MA.

1 个答案:

答案 0 :(得分:0)

获得预期结果的一种方法是使用falseSubstring联接几个映射表,并使用CharIndexIsNull的技巧的NullIf

首先,创建并填充示例表(在您将来的问题中为我们保存此步骤):

case

查询:

DECLARE @Map AS TABLE
(
    Val varchar(10),
    Col int
)
INSERT INTO @Map (Val, Col) VALUES
('mr.', 1), ('mrs.', 1), ('miss', 1), 
('MA.', 2), ('MS.', 2), ('BA.', 2)

DECLARE @T AS TABLE
(
    Col1 varchar(10)
)

INSERT INTO @T (Col1) VALUES
('mr. MA.'), ('mrs. MS.'), ('mr.'), 
('miss'), ('BA.'), ('MA.')

结果:

SELECT Col1,
        CASE WHEN M1.Col = 1 THEN M1.Val END As Title1,
        CASE WHEN M2.Col = 2 THEN M2.Val END As Title2
FROM @T AS t 
JOIN @Map AS M1
    ON M1.Val = SUBSTRING(Col1, 1, ISNULL(NULLIF(CHARINDEX(' ', Col1), 0), LEN(Col1)))
JOIN @Map AS M2
    ON M2.Val = SUBSTRING(Col1, ISNULL(NULLIF(CHARINDEX(' ', Col1), 0), 0) + 1, LEN(Col1))

You can see a live demo on rextester.