tsql - 从字符串中吐出第一部分和最后一部分
问题描述
我正在寻找将字符串分成第一部分和最后一部分。基本上,最后一个词被认为是最后一部分,剩下的部分被称为第一部分。以下是我迄今为止尝试过的
DECLARE @Col TABLE
(
ColumnName VARCHAR(100)
)
INSERT INTO @Col(ColumnName)
VALUES
('ABC, DEF GHI,'), -- Expeted output: FirstPart: ABC, DEF LastPart: GHI
('A,'), -- Expected Output: FirstPart: NULL LastPart: A
(' '), -- Expected Output: FirstPart: NULL LastPart: NULL
(''), -- Expected Output: FirstPart: NULL LastPart: NULL
('A , '),-- Expected Output: FirstPart: NULL LastPart: A
('ABC DEF G.HI, ') -- Expected Output: FirstPart: ABC DEF LastPart: G.HI
SELECT '' AS FirstPart, -- I don't know how to get the FirstPart of the string
SUBSTRING(ColumnName, 1, LEN(ColumnName) - CHARINDEX(' ', REVERSE(ColumnName))) AS LastPart FROM @Col
解决方案
这是一种方法 - 使用几个常见的表表达式并依赖于在字符串比较中忽略尾随空格的事实我想出了这个(我知道它看起来很麻烦,也许是时候了(这里几乎是凌晨 1 点) ,但它给出了正确的结果):
WITH CTE1 AS
(
SELECT ColumnName,
CHARINDEX(' ', REVERSE(ColumnName), PATINDEX('%[A-Z]%', REVERSE(ColumnName))) As LastSpaceBeforeLastWord
FROM @Col
), CTELastPart AS
(
SELECT ColumnName,
LastSpaceBeforeLastWord,
TRIM(
CASE
-- LEN(' ') also returns 0...
WHEN LEN(ColumnName) = 0 THEN NULL
WHEN LastSpaceBeforeLastWord = 0 THEN ColumnName
ELSE RIGHT(ColumnName, LastSpaceBeforeLastWord)
END
) As LastPart
FROM CTE1
)
-- ' ' equals ''...
SELECT ColumnName, TRIM(NULLIF(REPLACE(ColumnName, LastPart, ''), '')) As FirstPart, LastPart
FROM CteLastPart
结果:
ColumnName FirstPart LastPart
ABC, DEF GHI, ABC, DEF GHI,
A, NULL A,
NULL NULL
NULL NULL
A , NULL A ,
ABC DEF G.HI, ABC DEF G.HI,
在线演示DB<>Fiddle
推荐阅读
- c# - 'Application' 是 'system.windows.forms.application' 和 'Microsoft.office.interop.word.application' 之间的模糊引用
- winapi - 指向 winapi LPVOID 的 Rust 函数指针
- ios - 如何将单个 Azure 通知中心或单个 p12 文件用于多个 Flutter 应用程序?
- cross-compiling - 你能帮我用 risc-v 的 QEMU 解决这个交叉编译错误吗?
- php - 从 PHP CLI 导出环境变量
- c# - c# interop excel - 将过滤后的范围复制到数组/列表
- components - 解释 FB Prophet plot_components
- javascript - 无法在本机反应中访问关联类的功能
- django - Django 导航栏链接在新选项卡中打开
- postgresql - PostgresQL 查询使用向后索引扫描而不是仅索引扫描