使用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.
答案 0 :(得分:0)
获得预期结果的一种方法是使用false
,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))