sql - 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.
解决方案
Substring
获得所需结果的一种方法是使用,和使用and而不是 的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.
推荐阅读
- ruby-on-rails - Rails 5 cancancan定义多个条件的能力和单个条件的检查能力不起作用
- vba - 选择下拉框 (VBA)
- haskell - 如何使用 Aeson 解析分布在数组中的值?
- c++ - 调用单个第三方函数会导致 regsvr32 失败,即使以管理员身份
- windows - Azure 日志分析 - 服务的可用性
- spring-webflux - 无法在 reactor-netty 版本 0.9.10 上设置 WriteTimeout
- kubernetes - 我正在尝试为我的 istio 特使代理添加自签名证书。但我不确定要使用的 openssl 命令
- discord.js - 不和谐.js | 无法将用户 ID 解析为解禁
- javascript - 如何仅在 iframe 完全加载后才显示页面?
- reactjs - 如何在本机反应中检查来自 AsyncStorage 的数据?