2015-09-07 98 views
1

我在格式中有一个字符串。 (例如902.5)
需要分割和收集到单独的变量,这在SQL Server 2008sql服务器中的子字符串

DECLARE 
     @Core VARCHAR(10)='902.5', 
     @OrgNumber VARCHAR(6) = NULL, 
     @DeptNumber VARCHAR(2) = NULL 

     IF (NULLIF(@Core, '')) IS NOT NULL 
     BEGIN 
      SELECT @OrgNumber =SUBSTRING(@Core, 1, CHARINDEX('.', @Core) - 1), 
        @DeptNumber =SUBSTRING(@Core, CHARINDEX('.', @Core) + 1, LEN(@Core)) 

      SELECT @OrgNumber = upper(nullif(ltrim(nullif(rtrim(@OrgNumber), '')), '')), 
@DeptNumber = nullif(ltrim(nullif(rtrim(@DeptNumber), '')), '') 
     END 

然而,这不处理,其中包含组织REF(不使用部门REF)如情况902
如何我是否在同一陈述中优雅地处理案件?

+0

是否总是相同的格式? –

+0

是 - 它将始终是x.y或简单地x – IUnknown

回答

0

更新查询。另外,请注意您的IF (NULLIF(@Core, '')) IS NOT NULL不正确。

DECLARE @Core  VARCHAR(10)='902', 
     @OrgNumber VARCHAR(6) = NULL, 
     @DeptNumber VARCHAR(2) = NULL 

IF @Core IS NOT NULL 
    BEGIN 
     SELECT @OrgNumber = CASE 
          WHEN Charindex('.', @Core) > 0 THEN 
          Substring(@Core, 1, Charindex('.', @Core) 
               - 1) 
          ELSE Substring(@Core, 1, Len(@Core)) 
          END, 
      @DeptNumber = CASE 
          WHEN Charindex('.', @Core) > 0 THEN 
          Substring(@Core, 
          Charindex('.', @Core) + 1 
          , Len(@Core)) 
          ELSE NULL 
          END 

     SELECT @OrgNumber = Upper(NULLIF(Ltrim(NULLIF(Rtrim(@OrgNumber), '')), '') 
         ), 
      @DeptNumber = NULLIF(Ltrim(NULLIF(Rtrim(@DeptNumber), '')), '') 
    END 

SELECT @OrgNumber, 
     @DeptNumber 
2

使用PARSENAME功能

DECLARE @Core VARCHAR(50)= '902.2' 

SELECT Parsename(@Core, CASE WHEN Charindex('.', @Core) > 0 THEN 2 ELSE 1 END) AS OrgNumber, 
     Parsename(@Core, CASE WHEN Charindex('.', @Core) > 0 THEN 1 ELSE 2 END) AS DeptNumber 
+0

PARSENAME从右到左工作 - 如果分隔符'。'将分配组织编号给部门参考。不见了。 – IUnknown