如何在SQL Server 2008中查找列中表达式的长度

时间:2013-03-08 20:59:12

标签: sql sql-server

我不是数据库管理员,但我经常要查询数据库来完成我的工作。最近,我的任务是查询数据库列中分号分隔表达式的长度。它可能更容易显示为一个简化的示例表和列:

  • 表格为Table1
  • 列为Column1

Table1.Column1中两行的值如下所示:

principal_name='Joe Schmoe'; marital_status='m'; shoe_size='12.5';
message='This is a message which is 45 characters long'; 
years_active='15'

principal_name='Jim Schmim'; marital_status='s'; shoe_size='10.5'; 
message='This is a xxxxxxxxxxx message which is 57 characters long'; 
years_active='6' 

我需要查询Table1.Column1并查看此列的邮件部分中有多少行超过50个字符。

如果此列只有一个值,我可以使用类似:

SELECT COUNT(*) FROM Table1 WHERE LEN(column1) > 40

但是,我不需要知道该字段的总字符数,只需知道message=;之间的字符数

我以前从未处理过以分号分隔的多个值的列,所以我不知道如何查询我需要知道的内容。

3 个答案:

答案 0 :(得分:1)

假设column1中的部分始终相同,顺序相同,之类的内容
where ( CharIndex('years_active=',column1) - CharIndex('message=',column1) ) >50
(对描述的长度等进行或进行一些调整)

答案 1 :(得分:0)

你可以在自定义功能中尝试这样的事情

Declare @str varchar(max);
set @str = 'aaaabc=thisisatest;aaaaa'
select LEN(substring(@str,CHARINDEX('=',@str,0)+1, CHARINDEX(';',@str,0)-CHARINDEX('=',@str,0)-1))

答案 2 :(得分:0)

试试这个

;with cte as
(
    select 'principal_name=''Joe Schmoe''; marital_status=''m''; shoe_size=''12.5'';message=''This is a message which is 45 characters long'';years_active=''15''' as column1
    union
    select 'principal_name=''Jim Schmim''; marital_status=''s''; shoe_size=''10.5''; message=''This is a xxxxxxxxxxx message which is 57 characters long''; years_active=''6'''
), 
cte2 as 
(
    SELECT ltrim(rtrim(r.value('.','VARCHAR(MAX)'))) as Item from (
    select CONVERT(XML, N'<root><r>' + REPLACE(column1,';','</r><r>') + '</r></root>') as XmlString
    from cte ) x
    CROSS APPLY x.XmlString.nodes('//root/r') AS RECORDS(r)
)
--SELECT *, LEN(item) - 10 from cte2 x where x.Item like 'message=%' and LEN(item) > 50
SELECT COUNT(*) cnt from cte2 x where x.Item like 'message=%' and LEN(item) > 50