sql-text函数不工作(reverse/left/substring/ltrim)-一定很简单

niknxzdl  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(261)

我在一个表上有一个文本字段,我正试图在select语句中将它分解为两个独立的列。我发誓上次我用它的时候它对我有效,但是现在它抛出了一个错误“无效的长度参数”。我做错什么了?
从单个列中拆分数据,如下所示:
“公司-部门-地区-团队-主管”
分成两列,如:
主管团队
这是我曾经拥有的东西,我发誓曾经有用过,但现在已经没有了,我想不出来了!

Reverse(Left(Reverse(table.column),CHARINDEX(' ', Reverse(table.column))-1)) AS 'SUPERVISOR'
,LTRIM(LEFT(Substring(table.column,18,150),CHARINDEX(' - ', Substring(table.column,18,150))-1)) AS 'TEAM'
bkhjykvo

bkhjykvo1#

如果您有一个已知的或最大的项目数,请考虑一点xml。也许更容易阅读和维护。
另外,如果你只对团队和主管感兴趣,你可以去掉pos1,pos2,pos3。
例子

Declare @YourTable Table ([ID] varchar(50),[SomeCol] varchar(50))
Insert Into @YourTable Values 
 (1,'CORP - DIVISION - REGION - TEAM - SUPERVISOR')

Select A.ID
      ,B.*
 From  @YourTable A
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(100)')))  
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(100)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(100)')))
                      ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(100)')))
                      ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(100)')))
                      ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(100)')))
                      ,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(100)')))
                      ,Pos8 = ltrim(rtrim(xDim.value('/x[8]','varchar(100)')))
                      ,Pos9 = ltrim(rtrim(xDim.value('/x[9]','varchar(100)')))
                From  (Select Cast('<x>' + replace(SomeCol,'-','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

退货

ID  Pos1    Pos2        Pos3    Pos4    Pos5        Pos6    Pos7    Pos8    Pos9
1   CORP    DIVISION    REGION  TEAM    SUPERVISOR  NULL    NULL    NULL    NULL

编辑
如果有非xml安全字符(<、>、…),请使用

...
From  ( values (cast('<x>' + replace((Select replace(SomeCol,'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml)))  A(xDim)
...
lhcgjxsq

lhcgjxsq2#

在sql server 2016中,您可以使用string\u split()来执行此操作。
字符串\u split()可以通过拆分这些多值列来帮助规范化数据。
我还使用了trim()函数(在sql server 2017中引入)来删除空格、cte、row\u number()和pivot。
在脚本下面:

—-1 Create a test table
CREATE TABLE #TestTable
(
    TestColumn varchar(100)
)

—-2 Inserting your string into table
INSERT INTO #TestTable
VALUES ('0 - CORP - DIVISION - REGION - TEAM - SUPERVISOR')

--3 Final query
;WITH CTE_Table AS (
 SELECT
     TestColumn = TRIM(TestColumn)
 FROM
     #TestTable
 )
 ,CTE_Table2 AS (
 SELECT
     S.Value 
 FROM 
     CTE_Table
     CROSS APPLY STRING_SPLIT([TestColumn],'-') AS S
 )
 ,CTE_FinalTable AS (
 SELECT TOP 5
    Value
   ,ROW_NUMBER() OVER (ORDER BY Value) AS RowNumber
 FROM
    CTE_Table2
 ORDER BY
    Value
)
SELECT 
    [1],[2],[3],[4],[5]
FROM
   CTE_FinalTable
PIVOT 
   (MAX([value])
The FOR [RowNumber] IN ([1],[2],[3],[4],[5])
) AS P

相关问题