MSSQL Server中的SPLIT或TRIM文本(String,Varchar)

时间:2018-04-09 09:51:08

标签: sql tsql case sql-server-2017

我想在表格中拆分或“修剪”我的SQL-Server中的字段(名称)...但是我在每个尝试过的方式都会出错。

我个人更好的方式声明示例错误代码:

  

未找到SingleWords列或用户定义的聚合“SingleWords.value”,或者名称不明确。

例如:

我有一个名为“名字”的字段。这个字段包括forename&姓氏(以CR / LF或空格分隔)。

对于我的声明,我需要将名称拆分为两个不同的字段..但我只想使用SQL-Management Studio ..

这可能吗?

我的SQL Compability Level是“130”......

我尝试了下面的Statement for Example:

SELECT NAME FROM dbo.CRM_IM_X STRING_SPLIT(Name, CHAR(13)+CHAR(10)) WHERE RTRIM(NAME) <> '';

或(我个人更好的方式):

SELECT CAST('<x>' + REPLACE(NAME,CHAR(13)+CHAR(10),'</x><x>') + '</x>' AS XML) AS SingleWords
    FROM dbo.CRM_IM_X

SELECT SingleWords.value('x[1]','varchar(max)') AS part1
      ,SingleWords.value('x[2]','varchar(max)') AS part2
FROM dbo.CRM_IM_X

Forename的第1部分,

姓氏的第2部分,

CHAR(13)+ CHAR(10)表示CR / LF。

示例数据输入:

DECLARE @tbl TABLE(NAME VARCHAR(100));
INSERT INTO @tbl VALUES('Jane
Doe'),('John
Doe');

但我仍然坚持将这两个选择陈述结合在一起......

4 个答案:

答案 0 :(得分:0)

以下代码对您有所帮助,

// You can use the Common Table Expression(CTE).
;WITH Split_Names (SingleWords)
AS
(
   SELECT CONVERT(XML,'<Names><name>'  
                      + REPLACE(Names,' ', '</name><name>') 
                      + '</name></Names>'
                 ) AS SingleWords
   FROM ExampleTable
)

SELECT  SingleWords.value('/Names[1]/name[1]','varchar(100)') AS part1,    
        SingleWords.value('/Names[1]/name[2]','varchar(100)') AS part2,
        SingleWords.value('/Names[1]/name[3]','varchar(100)') AS part3
FROM Split_Names

SQL Fiddle Demo

答案 1 :(得分:0)

使用您的新数据(您没有标题),可以轻松实现以下目标:

DECLARE @tbl TABLE(NAME VARCHAR(100));
INSERT INTO @tbl VALUES('Jane
Doe'),('John
Doe');

WITH Replaced AS(
    SELECT REPLACE([NAME],CHAR(13),'') AS [Name]
    FROM @tbl)
SELECT LEFT([name], CHARINDEX(CHAR(10),[Name]) -1) AS FirstName,
       RIGHT([name], LEN([Name]) - (CHARINDEX(CHAR(10),[Name]))) AS Surname
FROM Replaced;

然而,正如我在评论中所讨论的那样,问题在于你是否开始拥有不仅仅有2个部分的名字。举个例子,看看我们这样做会发生什么:

DECLARE @tbl TABLE(NAME VARCHAR(100));
INSERT INTO @tbl VALUES('Jane
Doe'),
('John
Doe'),
('Mr
Smith'),
('Mr
Joe
Bloggs'),
('George
W.
Bush'),
('Sir
Friedrich
Harold
Smithe
III');

WITH Replaced AS(
    SELECT REPLACE([NAME],CHAR(13),'') AS [Name]
    FROM @tbl)
SELECT LEFT([name], CHARINDEX(CHAR(10),[Name]) -1) AS FirstName,
       RIGHT([name], LEN([Name]) - (CHARINDEX(CHAR(10),[Name])))
FROM Replaced;

答案 2 :(得分:0)

感谢您的帮助! @Larnu你是对的,如果CR / LF也用于标题你会得到这个问题,如果我只使用2部分。但如果我得到第三部分&amp;第四部分,我认为它可能,当名称语法每次都像:标题(CR / LF),Forename(CR / LF),姓氏

如果语法不一样,我还需要一个步骤,将名称的正确信息放到正确的字段中我认为?:

以下代码现在也有效。此示例将把CR / LF之前和之后的每个单词放在一个新字段中:

DECLARE @tbl TABLE(NAME VARCHAR(100));
INSERT INTO @tbl VALUES('Jane
Doe'),
('John
Doe'),
('Mr
john
Smith'),
('Mr
Joe
Bloggs'),
('George
W.
Bush'),
('Sir
Friedrich
Harold
Smithe
III');

WITH Splitted AS
(
SELECT CAST('<x>' + REPLACE(NAME,CHAR(13)+CHAR(10),'</x><x>') + '</x>' AS XML) AS SingleWords
    FROM @tbl
)
SELECT SingleWords.value('x[1]','varchar(max)') AS part1
      ,SingleWords.value('x[2]','varchar(max)') AS part2
      ,SingleWords.value('x[3]','varchar(max)') AS part3
      ,SingleWords.value('x[4]','varchar(max)') AS part4
FROM Splitted

答案 3 :(得分:0)

您可以使用下面给出的简单代码:

SELECT SUBSTRING(Name, 1, CHARINDEX(' ', Name)) AS PART1, 
       SUBSTRING(Name, CHARINDEX(' ', Name), LEN(Name)) AS PART2 
FROM ExampleTable

我已将此SQLFiddle添加到此解决方案中。你可以检查一下。祝你好运!