在SQL server中查找模式的端点

在SQL server中查找模式的端点,sql,sql-server,string,tsql,Sql,Sql Server,String,Tsql,列中有一个逗号分隔的字符串,如下所示 test=1,value=2.2,system=321 我想从字符串中提取值。我可以使用select PatIndex“%value=%”,columnName然后使用left,但这只能找到PatIndex的开头 如何识别模式值=%的结尾,以便我们可以提取该值?用CHARINDEX和您的PATHINDEX链接几个子字符串 结果: Original Parsed test=1,value=2.2,system=3

列中有一个逗号分隔的字符串,如下所示

test=1,value=2.2,system=321
我想从字符串中提取值。我可以使用select PatIndex“%value=%”,columnName然后使用left,但这只能找到PatIndex的开头

如何识别模式值=%的结尾,以便我们可以提取该值?

用CHARINDEX和您的PATHINDEX链接几个子字符串

结果:

Original                        Parsed
test=1,value=2.2,system=321     2.2
请注意,如果值=,后面没有逗号,CHARINDEX将失败。你可以用WHERE来过滤

我强烈建议将已拆分的值存储在适当的表中,这样就不必处理字符串噩梦。

用CHARINDEX和PATHINDEX链接几个子字符串

结果:

Original                        Parsed
test=1,value=2.2,system=321     2.2
请注意,如果值=,后面没有逗号,CHARINDEX将失败。你可以用WHERE来过滤


我强烈建议您将已拆分的值存储在适当的表中,这样您就不必处理字符串噩梦。

您可以尝试以下方法

DECLARE @xml AS XML 
SELECT @xml = Cast(( '<X>' + Replace(txt, ',', '</X><X>') + '</X>' ) AS XML) 
FROM   (VALUES ('test=1,value=2.2,system=321')) v(txt) 

SELECT LEFT(value, Charindex('=', value) - 1)           AS LeftPart, 
       RIGHT(value, Charindex('=', Reverse(value)) - 1) AS RightPart 
FROM   (SELECT n.value('.', 'varchar(100)') AS value 
        FROM   @xml.nodes('X') AS T(n))T 

你可以试试下面的方法

DECLARE @xml AS XML 
SELECT @xml = Cast(( '<X>' + Replace(txt, ',', '</X><X>') + '</X>' ) AS XML) 
FROM   (VALUES ('test=1,value=2.2,system=321')) v(txt) 

SELECT LEFT(value, Charindex('=', value) - 1)           AS LeftPart, 
       RIGHT(value, Charindex('=', Reverse(value)) - 1) AS RightPart 
FROM   (SELECT n.value('.', 'varchar(100)') AS value 
        FROM   @xml.nodes('X') AS T(n))T 
可以使用带有起始位置的CHARINDEX查找模式后的第一个逗号。交叉应用用于使查询更易于阅读:

WITH tests(str) AS (
    SELECT 'test=1,value=2.2,system=321'
)
SELECT str, substring(str, pos1, pos2 - pos1) AS match
FROM tests
CROSS APPLY (SELECT PATINDEX('%value=%', str) + 6) AS ca1(pos1)
CROSS APPLY (SELECT CHARINDEX(',', str, pos1 + 1)) AS ca2(pos2)
-- 2.2
可以使用带有起始位置的CHARINDEX查找模式后的第一个逗号。交叉应用用于使查询更易于阅读:

WITH tests(str) AS (
    SELECT 'test=1,value=2.2,system=321'
)
SELECT str, substring(str, pos1, pos2 - pos1) AS match
FROM tests
CROSS APPLY (SELECT PATINDEX('%value=%', str) + 6) AS ca1(pos1)
CROSS APPLY (SELECT CHARINDEX(',', str, pos1 + 1)) AS ca2(pos2)
-- 2.2
首先,如果要查询非规范化数据,请不要以这种方式存储它们。SQL语言不擅长字符串操作。解析和拆分字符串也不能利用索引,这意味着任何试图查找引用系统321的所有记录的查询都必须扫描和解析所有行

SQL Server 2016和JSON

SQL Server 2016为JSON和字符串分割函数添加了支持。早期版本已经提供了XML类型。最好将复杂值存储为JSON或XML,而不是试图解析字符串

一个选项是将字符串转换为JSON对象并检索值内容,例如:

DECLARE @text VARCHAR(100) = 'test=1,value=2.2,system=321'

select json_value('{"' + replace(replace(@text,',','","'),'=','":"') + '"}','$.value')
这将返回2.2

替换将原始字符串转换为

{"test":"1","value":"2.2","system":"321"}
JSON_VALUE@json,“$”将返回该对象的value属性

早期SQL Server版本

在早期的SQL Server版本中,您可以使用相同的方法将该字符串转换为XML元素,并使用XQuery:

DECLARE @text VARCHAR(100) = 'test=1,value=2.2,system=321';

declare @xml varchar(100)='<r ' + replace(replace(@text,',','" '),'=',' ="') + '" />';
select @xml
select cast(@xml as xml).value('(/r[1]/@value)','varchar(20)')
查询结果是2.2

首先,如果要查询非规范化数据,请不要以这种方式存储它们。SQL语言不擅长字符串操作。解析和拆分字符串也不能利用索引,这意味着任何试图查找引用系统321的所有记录的查询都必须扫描和解析所有行

SQL Server 2016和JSON

SQL Server 2016为JSON和字符串分割函数添加了支持。早期版本已经提供了XML类型。最好将复杂值存储为JSON或XML,而不是试图解析字符串

一个选项是将字符串转换为JSON对象并检索值内容,例如:

DECLARE @text VARCHAR(100) = 'test=1,value=2.2,system=321'

select json_value('{"' + replace(replace(@text,',','","'),'=','":"') + '"}','$.value')
这将返回2.2

替换将原始字符串转换为

{"test":"1","value":"2.2","system":"321"}
JSON_VALUE@json,“$”将返回该对象的value属性

早期SQL Server版本

在早期的SQL Server版本中,您可以使用相同的方法将该字符串转换为XML元素,并使用XQuery:

DECLARE @text VARCHAR(100) = 'test=1,value=2.2,system=321';

declare @xml varchar(100)='<r ' + replace(replace(@text,',','" '),'=',' ="') + '" />';
select @xml
select cast(@xml as xml).value('(/r[1]/@value)','varchar(20)')

查询结果为2.2

如果您使用的是SQL Server 2016或更高版本,则可以尝试以下查询

SELECT RIGHT(Value,CHARINDEX('=',REVERSE(Value))-1) FROM YourTableName
CROSS APPLY STRING_SPLIT ( ColumnName , ',' )  
WHERE Value Like 'Value=%'

如果您使用的是SQL Server 2016或更高版本,则可以尝试以下查询

SELECT RIGHT(Value,CHARINDEX('=',REVERSE(Value))-1) FROM YourTableName
CROSS APPLY STRING_SPLIT ( ColumnName , ',' )  
WHERE Value Like 'Value=%'

SQL语言不是用于字符串操作的。首先,数据不应该像这样存储。这甚至打破了第一范式。加载数据时,拆分字符串或处理CSV文件要容易得多。这些值可能是表中的独立列或相关的独立表。如果希望将该字符串视为值,可以将其存储为XML或JSON,并使用XML或JSON函数。但是,如果您想查询它们,这意味着它们不能被视为简单值。您针对的是哪个SQL Server版本?SQL Server 2016增加了对JSON和JSON的支持。XML是在2005年添加的。您可以将此字符串存储在xml类型的fieldSQL中,该语言不适用于字符串操作。首先,数据不应该像这样存储。这甚至打破了第一范式。加载数据时,拆分字符串或处理CSV文件要容易得多。这些值可能是表中的独立列或相关的独立表。如果希望将该字符串视为值,可以将其存储为XML或JSON,并使用XML或JSON函数。但是,如果您想查询它们,这意味着它们不能被视为简单值。您针对的是哪个SQL Server版本?SQL Server 2016增加了对JSON和JSON的支持。XML是在2005年添加的。您可以将此字符串存储在xml类型的字段中