我在表Variables
中有一个列Functions
,其中包含一个由&
字符分隔的值字符串,用于显示每个学生插入函数的输入。
如何在不使用函数或存储过程的情况下拆分该字符串并找到最常用的变量? (我认为后一部分可以通过COUNT(*)
和适当的GROUP BY
轻松解决。)
数据示例:
StudentID FunctionName Variables
1 Example1 Var1=10&Var2=xy&Sign=True&Role=False
答案 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 ║
╚═══════════╩══════════════╩══════════╩═══════════════╝
修改强>
假设您的数据包含<
个字符。您需要将其更改为<
Other EntityReferences
SELECT StudentId, FunctionName,
[Variables] = REPLACE(REPLACE(Variables, '&', 'separator'), '<', '<')
FROM #tab
<强> LiveDemoWithDataSanitizing 强>