首页 > 解决方案 > 从字符串中吐出第一部分和最后一部分

问题描述

我正在寻找将字符串分成第一部分和最后一部分。基本上,最后一个词被认为是最后一部分,剩下的部分被称为第一部分。以下是我迄今为止尝试过的

    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

标签: tsqlsql-server-2012

解决方案


这是一种方法 - 使用几个常见的表表达式并依赖于在字符串比较中忽略尾随空格的事实我想出了这个(我知道它看起来很麻烦,也许是时候了(这里几乎是凌晨 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


推荐阅读