sql - SQL Server 2014 中的函数 STRING_SPLIT
问题描述
我开始使用 T-SQL 分析日志。我有一个问题我无法处理。
示例消息:
LogsID = "1" Value="1" Value="2" Value="3"
因此,当我知道我有多少价值时,我对拆分这个没有问题,例如:
我使用代码部分的代码来拆分这些数据,如下所示:
LogsID Value
---------------
1 1
代码:
DECLARE @String VARCHAR(1024);
SET @String = 'LogsID = "1" Value="1" Value="2" Value="3"'
SELECT
SUBSTRING(@String,
CHARINDEX('Logs_ID="', @String) + 11,
CHARINDEX('Value="', @String) - (CHARINDEX('Logs_ID="', @String) + 13))
但是当我不知道日志字符串中有多少“值”条目时,我不知道如何处理如下日志:
LogsID = "1" Value="1" Value="2" Value="3"
我想像这样拆分这些信息:
LogsID Value
------------
1 1
1 2
1 3
解决方案
使用拆分功能(在 SQL Server 2016 之前有很多方法可以做到这一点,这里是一种):
CREATE FUNCTION [dbo].[SplitString]
(
@List NVARCHAR(MAX),
@Delim VARCHAR(255)
)
RETURNS TABLE
AS
RETURN ( SELECT [Value] FROM
(
SELECT
[Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number],
CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number])))
FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
FROM sys.all_objects) AS x
WHERE Number <= LEN(@List)
AND SUBSTRING(@Delim + @List, [Number], LEN(@Delim)) = @Delim
) AS y
);
查询变得比一堆 charindex 等和未知端点更简单:
DECLARE @String VARCHAR(1024) = 'LogsID = "1" Value="1" Value="2" Value="3"';
;WITH x AS
(
SELECT value, p = PARSENAME(value,1)
FROM dbo.SplitString(@String, 'Value=')
),
l AS
(
SELECT LogsID = PARSENAME(LTRIM(SUBSTRING(value,CHARINDEX('=',value)+1,255)),1)
FROM x WHERE p IS NULL
)
SELECT l.LogsID,y.p FROM l
CROSS JOIN (SELECT p FROM x WHERE p IS NOT NULL) AS y;
推荐阅读
- xcode - Xcode 不支持 USDZ 文件格式
- database - OneToMany(fetch=FetchType.EAGER) 是否执行 N+1 个查询
- vespa - 自定义请求处理程序在启动时失败
- c - 使用 mingw64 提供的控制台检测 stdout 是否为 MS Visual 编译的控制台
- python - “pretty_print”不适用于 python3.x 中显示的 xml
- javascript - 处理来自多个表单输入的多个 AJax 发布失败
- angular - Directive issue in Angular
- database - Cassandra DB - 没有活动节点?
- python - Python 类型errorfloatrequiredline.20
- regex - 检查变量是否与子字符串列表匹配