Sql 如何选择具有多个分隔符的数据行

Sql 如何选择具有多个分隔符的数据行,sql,sql-server-2012,Sql,Sql Server 2012,我在SQL Server 2012中有一个表,其中有一列包含以下数据: EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS 分号分隔雇主,最多5个,逗号分隔employeername和雇主地址 我需要选择行并按如下方式显示: EMPNAME1 EMPADDRESS1 EMPNAME2 EMPADDRESS2 EMPNAME3 EMPADDRESS3..... SELECT CONVE

我在SQL Server 2012中有一个表,其中有一列包含以下数据:

EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS
分号分隔雇主,最多5个,逗号分隔
employeername
和雇主地址

我需要选择行并按如下方式显示:

EMPNAME1 EMPADDRESS1 EMPNAME2 EMPADDRESS2 EMPNAME3 EMPADDRESS3..... 
SELECT 
    CONVERT(NVARCHAR(MAX), ROW_NUMBER() OVER (ORDER BY Item)) AS EmployeeId, 
    SUBSTRING(Item, 0, CHARINDEX (',', Item)) AS EmployeeName,
    SUBSTRING(Item, CHARINDEX (',', Item) + 1,LEN(Item)) AS EmployeeAddress
FROM 
    dbo.split('EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS', ';') AS Employee

基本上,我会编写一个特定的splitstring函数来满足您的需要,并在源表上的select中使用它。看看CHARINDEX()和SUBSTRING()。下面是一个快速抓取的例子,可以让事情变得清楚: 以及有关如何编写tsql函数的更多信息:


没有问题的代码,没有答案的代码,希望它有帮助=)

您可以使用以下代码创建拆分函数:

CREATE FUNCTION dbo.split (    

    --DECLARE
          @Input NVARCHAR(MAX),
          @Character CHAR(1)

) RETURNS @Output TABLE (Item NVARCHAR(1000))
AS
BEGIN
      DECLARE @StartIndex INT, @EndIndex INT

      SET @StartIndex = 1

      IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character
          BEGIN
                SET @Input = @Input + @Character

          END

      WHILE CHARINDEX(@Character, @Input) > 0
          BEGIN
                SET @EndIndex = CHARINDEX(@Character, @Input)

                INSERT INTO @Output(Item)
                SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1)

                SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input))

          END

      RETURN

END
GO
上面的查询将在一个整洁的表格中显示您的数据

以此为基础,我创建了以下过程,该过程接受单个NVARCHAR输入参数,并按照您要求的方式显示列:

CREATE PROCEDURE Employee(

    --DECLARE
            @Input NVARCHAR(MAX) = 'EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS'

) AS
BEGIN

    SELECT 
        CONVERT(NVARCHAR(MAX), ROW_NUMBER() OVER (ORDER BY Item)) AS EmployeeId, 
        SUBSTRING(Item, 0, CHARINDEX (',', Item)) AS EmployeeName,
        SUBSTRING(Item, CHARINDEX (',', Item) + 1,LEN(Item)) AS EmployeeAddress
    INTO #Employees
    FROM 
        dbo.split(@Input, ';') AS Employee


    SELECT
        (SELECT TOP 1 EmployeeName FROM #Employees WHERE EmployeeId = 1) AS EmpName1,
        (SELECT TOP 1 EmployeeAddress FROM #Employees WHERE EmployeeId = 1) AS EmpAddress1,
        (SELECT TOP 1 EmployeeName FROM #Employees WHERE EmployeeId = 2) AS EmpName2,
        (SELECT TOP 1 EmployeeAddress FROM #Employees WHERE EmployeeId = 2) AS EmpAddress2,
        (SELECT TOP 1 EmployeeName FROM #Employees WHERE EmployeeId = 3) AS EmpName3,
        (SELECT TOP 1 EmployeeAddress FROM #Employees WHERE EmployeeId = 3) AS EmpAddress3,
        (SELECT TOP 1 EmployeeName FROM #Employees WHERE EmployeeId = 4) AS EmpName4,
        (SELECT TOP 1 EmployeeAddress FROM #Employees WHERE EmployeeId = 4) AS EmpAddress4,
        (SELECT TOP 1 EmployeeName FROM #Employees WHERE EmployeeId = 5) AS EmpName5,
        (SELECT TOP 1 EmployeeAddress FROM #Employees WHERE EmployeeId = 5) AS EmpAddress5

    DROP TABLE #Employees

END
该程序的工作方式如下:

EMPNAME1 EMPADDRESS1 EMPNAME2 EMPADDRESS2 EMPNAME3 EMPADDRESS3..... 
SELECT 
    CONVERT(NVARCHAR(MAX), ROW_NUMBER() OVER (ORDER BY Item)) AS EmployeeId, 
    SUBSTRING(Item, 0, CHARINDEX (',', Item)) AS EmployeeName,
    SUBSTRING(Item, CHARINDEX (',', Item) + 1,LEN(Item)) AS EmployeeAddress
FROM 
    dbo.split('EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS', ';') AS Employee
  • 将该表保存到名为#Employees的临时表中
  • 选择前5名员工作为一行
  • 放下临时桌子
按以下方式使用该程序:

exec Employee 'EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS;EMPLOYER-NAME,EMPADDRESS'

请分享你尝试使用的SQL。你应该更清楚地说明你在问什么,并展示到目前为止你尝试了什么。下午好,简。一开始我没有意识到这一点,但我觉得我的答案是你答案的延伸。您要我在您的答案中添加我的代码吗?让我知道不行!你的回答比我的要费劲得多,所以如果有桂冠,你应该“收获桂冠”