我想在表格中拆分或“修剪”我的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');
但我仍然坚持将这两个选择陈述结合在一起......
答案 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
答案 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添加到此解决方案中。你可以检查一下。祝你好运!