我必须用'&'分开一个字符串。不使用函数或存储过程分隔的值?

时间:2015-10-13 08:57:43

标签: sql sql-server string tsql

我在表Variables中有一个列Functions,其中包含一个由&字符分隔的值字符串,用于显示每个学生插入函数的输入。

如何在不使用函数或存储过程的情况下拆分该字符串并找到最常用的变量? (我认为后一部分可以通过COUNT(*)和适当的GROUP BY轻松解决。)

数据示例:

StudentID     FunctionName    Variables

1             Example1        Var1=10&Var2=xy&Sign=True&Role=False

1 个答案:

答案 0 :(得分:3)

警告

您可能需要先清理输入,因为使用了XML。

<强> LiveDemo

CREATE TABLE #tab(StudentID INT, FunctionName NVARCHAR(100),  
Variables NVARCHAR(1000));

INSERT INTO #tab
VALUES (1,'Example1', 'Var1=10&Var2=xy&Sign=True&Role=False');


SELECT StudentId, FunctionName,
    Variable = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM 
( 
  SELECT StudentId, FunctionName,
         x = CONVERT(XML, '<i>' 
          + REPLACE(Variables, '&', '</i><i>') 
          + '</i>').query('.')
  FROM #tab
) AS a
CROSS APPLY x.nodes('i') AS y(i);

您可以使用子查询/ CTE包装拆分数据,并根据需要进行任何聚合。

修改

<强> LiveDemo2

WITH cte AS (
SELECT StudentId, FunctionName,
    Variable = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM 
( 
  SELECT StudentId, FunctionName,
         x = CONVERT(XML, '<i>' 
          + REPLACE(Variables, '&', '</i><i>') 
          + '</i>').query('.')
  FROM #tab
) AS a
CROSS APPLY x.nodes('i') AS y(i)
)
SELECT 
  StudentId, FunctionName,
   Variable      = SUBSTRING(Variable, 1, CHARINDEX('=', Variable)-1)
  ,VariableValue = SUBSTRING(Variable, CHARINDEX('=', Variable)+1, LEN(Variable)-CHARINDEX('=', Variable)+1) 
FROM cte;

结果:

╔═══════════╦══════════════╦══════════╦═══════════════╗
║ StudentId ║ FunctionName ║ Variable ║ VariableValue ║
╠═══════════╬══════════════╬══════════╬═══════════════╣
║         1 ║ Example1     ║ Var1     ║ 10            ║
║         1 ║ Example1     ║ Var2     ║ xy            ║
║         1 ║ Example1     ║ Sign     ║ True          ║
║         1 ║ Example1     ║ Role     ║ False         ║
╚═══════════╩══════════════╩══════════╩═══════════════╝

修改

假设您的数据包含<个字符。您需要将其更改为&lt; Other EntityReferences

SELECT StudentId, FunctionName,
     [Variables] = REPLACE(REPLACE(Variables, '&', 'separator'), '<', '&lt;')
FROM #tab

<强> LiveDemoWithDataSanitizing