Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-文本函数不工作(Reverse/Left/Substring/LTrim)-一定很简单_Sql_Sql Server_Text - Fatal编程技术网

SQL-文本函数不工作(Reverse/Left/Substring/LTrim)-一定很简单

SQL-文本函数不工作(Reverse/Left/Substring/LTrim)-一定很简单,sql,sql-server,text,Sql,Sql Server,Text,我在一个表上有一个文本字段,我正试图在select语句中将其分解为两个独立的列。我发誓上次我使用它时它对我有效,但现在它抛出了一个错误无效的长度参数。我做错了什么 从单个列拆分数据,如下所示: 公司-部门-区域-团队-主管 分为两列,如: 主管|团队 这是我曾经拥有的东西,我发誓它曾经有用过,但现在不再有用了,我想不出来了 Reverse(Left(Reverse(table.column),CHARINDEX(' ', Reverse(table.column))-1)) AS 'SUPERV

我在一个表上有一个文本字段,我正试图在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'
    

如果你有一个已知的或最多的项目,考虑一点XML。也许更容易阅读和维护

此外,如果您只对团队和主管感兴趣,您可以取消Pos1、Pos2、Pos3

范例

编辑

如果您有非XML安全字符,,。。。使用


如果你有一个已知的或最多的项目,考虑一点XML。也许更容易阅读和维护

此外,如果您只对团队和主管感兴趣,您可以取消Pos1、Pos2、Pos3

范例

编辑

如果您有非XML安全字符,,。。。使用


在SQL Server 2016中,您可以使用STRING_SPLIT来执行此操作

字符串_SPLIT可以通过拆分这些字符串来帮助规范化数据 多值列

我还使用了SQL Server 2017中引入的TRIM函数来删除空格、CTE、行号和轴

在脚本下面:

—-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

在SQL Server 2016中,您可以使用STRING_SPLIT来执行此操作

字符串_SPLIT可以通过拆分这些字符串来帮助规范化数据 多值列

我还使用了SQL Server 2017中引入的TRIM函数来删除空格、CTE、行号和轴

在脚本下面:

—-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

用您正在使用的数据库标记您的问题。我敢打赌,您在该列中的值不包含空格,或者在第18个字符和第150个字符之间不包含“-”。@ZoharPeled-您完全正确。我擦洗了数据,发现了一些偷偷摸摸的东西bast@rd在他们的标签中有一个(&a)。。。hrrrmmmmmm。。。。谢谢你给我指明了正确的方向!用您正在使用的数据库标记您的问题。我敢打赌,您在该列中的值不包含空格,或者在第18个字符和第150个字符之间不包含“-”。@ZoharPeled-您完全正确。我擦洗了数据,发现了一些偷偷摸摸的东西bast@rd在他们的标签中有一个(&a)。。。hrrrmmmmmm。。。。谢谢你给我指明了正确的方向!当然,这是一个很好的解决办法。。。解决方案是对数据进行标准化…@ZoharPeled 100%同意。我不得不使用一些来自外部来源的可怕数据,我相信你也有:这太棒了@JohnCappelletti!我正在将此设置为书签,以便稍后使用。非常感谢。但我同意你们的观点,数据规范化将使这些数据受益匪浅,不幸的是,这超出了我的控制范围。所以现在要找出一个解决方案,这是一个很好的解决方案。。。解决方案是对数据进行标准化…@ZoharPeled 100%同意。我不得不使用一些来自外部来源的可怕数据,我相信你也有:这太棒了@JohnCappelletti!我正在将此设置为书签,以便稍后使用。非常感谢。但我同意你们的观点,数据规范化将使这些数据受益匪浅,不幸的是,这超出了我的控制范围。因此,现在要解决按TestColumn划分的问题,按TestColumn排序将返回一个任意的行号。它基本上是按一个常量排序的,因为在每个分区中,您只得到一个用于排序的不同值。谢谢,有什么消息吗?按TestColumn划分的行数按TestColumn排序将返回任意行数。它基本上是按一个常量排序的,因为在每个分区中,您只得到一个用于排序的不同值。有什么好消息吗?
...
From  ( values (cast('<x>' + replace((Select replace(SomeCol,'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml)))  A(xDim)
...
—-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