我不是数据库管理员,但我经常要查询数据库来完成我的工作。最近,我的任务是查询数据库列中分号分隔表达式的长度。它可能更容易显示为一个简化的示例表和列:
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=
和;
之间的字符数
我以前从未处理过以分号分隔的多个值的列,所以我不知道如何查询我需要知道的内容。
答案 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