首页 > 解决方案 > TSQL 函数 新列的两个子字符串

问题描述

使用 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.

标签: sqltsqlsubstring

解决方案


Substring获得所需结果的一种方法是使用,和使用and而不是 的CharIndex技巧来连接到映射表。IsNullNullIfcase

首先,创建并填充示例表(在您以后的问题中保存我们这一步):

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))

结果:

Col1      |   Title1  |   Title2
mr. MA.   |   mr.     |   MA.
mrs. MS.  |   mrs.    |   MS.
mr.       |   mr.     |   NULL
miss      |   miss    |   NULL
BA.       |   NULL    |   BA.
MA.       |   NULL    |   MA.

您可以在 rextester 上看到现场演示。


推荐阅读