使用 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.
获得所需结果的一种方法是使用Substring
、CharIndex
和IsNull
和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))
结果:
Col1 | Title1 | Title2
mr. MA. | mr. | MA.
mrs. MS. | mrs. | MS.
mr. | mr. | NULL
miss | miss | NULL
BA. | NULL | BA.
MA. | NULL | MA.
您可以在rextester上看到现场演示。