如何在SQL中拆分字符串并显示该值
我有一列(a列),其值如下所示:如何在SQL中拆分字符串并显示该值,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一列(a列),其值如下所示: ThisValue=The Value;DateFrom=01/01/01;Regulated=No; 我只想选择值(来自列A),并将其显示在子查询中 到目前为止,我已经尝试使用REPLACE,但很难让它在select语句中工作。使用SUBSTRING和CHARINDEX 查询 declare @str as varchar(50) set @str = 'ThisValue=The Value;DateFrom=01/01/01;Regulated=No;
ThisValue=The Value;DateFrom=01/01/01;Regulated=No;
我只想选择值(来自列A),并将其显示在子查询中
到目前为止,我已经尝试使用REPLACE
,但很难让它在select
语句中工作。使用SUBSTRING
和CHARINDEX
查询
declare @str as varchar(50)
set @str = 'ThisValue=The Value;DateFrom=01/01/01;Regulated=No;'
select substring(@str,charindex('=',@str,1)+1,
((charindex(';',@str,1))-(charindex('=',@str,1))-1));
要做到这一点,您需要有一个拆分器。我最喜欢的是从杰夫·摩登这里找到的
有些人不喜欢这个,因为它有一个varchar(8000)的限制。我从来没有需要解析任何长度接近这个长度的分隔字符串,所以它对我来说总是很好的
要更深入地了解具有许多不同选项的拆分器,您可以查看本文
有没有一种方法可以在不声明变量的情况下执行此操作?在一个子查询中,我想选择“ThisValue=the value”内的值;但在另一个子查询中,我想选择“Regulated=no”内的值;因此,例如:在一个子查询中,我只想选择另一个子查询中的“the value”,我只想选择“01/01/01”,而不是一个变量。您可以使用列名称也可以这样。如果您对数据库有任何控制权,则需要修复此问题。你在这里做噩梦。您实际上是将整行存储在一列中。“这非常需要正常化。”SeanLange现在你感觉到我的痛苦了。我百分之百支持你,我最难匹配表达式“ThisValue=”以解析它后面的内容,直到分隔符“;”。
declare @Something varchar(100) = 'ThisValue=The Value;DateFrom=01/01/01;Regulated=No;'
select max(case when y.ItemNumber = 1 then y.Item end) as DataName
, max(case when y.ItemNumber = 2 then y.Item end) as DataValue
from dbo.DelimitedSplit8K(@Something, ';') x
cross apply dbo.DelimitedSplit8K(x.Item, '=') y
where x.Item > '' --This eliminates the trailing semicolon
group by x.ItemNumber
order by x.ItemNumber