【问题标题】:Get left & right side of optional character inline获取可选字符内联的左侧和右侧
【发布时间】:2013-04-29 14:09:33
【问题描述】:

我有以下不同类型的输入nvarchar 值:

  • FirstName|LastName
  • FirstName
  • |LastName

我需要在我的 SQL 脚本中将 FirstNameLastName 输出为单独的列。

SELECT FLname as Original
    ,SUBSTRING(FLname, 0, ISNULL(NULLIF(CHARINDEX('|', FLname),0), LEN(FLname)+1)) as FirstName
    ,SUBSTRING(FLname, ISNULL(NULLIF(CHARINDEX('|', FLname)+1,1), LEN(FLname)+1), LEN(FLname)+1) as LastName

这个逻辑确实有效,但我觉得它不可读,尤其是对于未来的开发者来说。

我知道我可以创建一个用户定义函数来存储这个逻辑,但我宁愿避免添加这个。

有没有更简洁的方法来实现作为内联 SQL 语句的预期结果?

【问题讨论】:

  • 好吧,如果你担心有人不明白你的意思,总有 cmets :)
  • 没有更易读的魔法内置函数,例如SplitFirstAndLastNameByPipe()。如果未来的开发人员无法理解 SUBSTRING、CHARINDEX 等,那么也许他们不应该维护/修改此代码,或者您应该修复输入。
  • 您可以随时创建函数:SplitFirstAndLastNameByPipe() 并将此代码放入其中。那么它是可重复使用的,它的目的是明确的

标签: sql sql-server sql-server-2008 tsql split


【解决方案1】:

我会这样做:(已更正)

;WITH cte As
(
    SELECT *,CHARINDEX('|', FLname) As PipeOffset
    FROM yourTable
)
SELECT
    FLname As Original,
    CASE When PipeOffset = 0 Then FLname
         When PipeOffset > 1 Then LEFT(FLname, PipeOffset-1)
         ELSE NULL  END     As FirstName,
    CASE When >0 And < LEN(FLname) 
         Then RIGHT(FLname, LEN(FLname)- PipeOffset)
         ELSE NULL  END     As LastName
FROM cte

【讨论】:

    【解决方案2】:

    这与@RBarryYoung 使用CTE 的答案非常相似,以便使用CHARINDEXLEFTRIGHT 函数具有清晰的可读性。如果需要,您可以将空字符串 ('') 替换为 null。

    FIDDLE DEMO

    ;with cte as (
      select FLname, charindex('|',FLname) divider
      from t
    )
    select FLname original, 
           case when divider = 1 then ''
                when divider > 1 then left(FLname, divider-1) 
           else FLname end firstName,
           case when divider > 0 then right(FLname, len(FLname)-divider)
                else '' end lastName
    from cte
    
    |           ORIGINAL | FIRSTNAME | LASTNAME |
    ---------------------------------------------
    | FirstName|LastName | FirstName | LastName |
    |          FirstName | FirstName |          |
    |          |LastName |           | LastName |
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-25
      • 1970-01-01
      • 2022-12-05
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      相关资源
      最近更新 更多