1

私はデータベース管理者ではありませんが、データベースにクエリを実行して仕事をしなければならないことがよくあります。最近、データベース列内のセミコロンで区切られた式の長さを照会する仕事を任されました。おそらく、作成されたテーブルと列の例として示す方が簡単でしょう:

  • 表はTable1です。
  • 列はColumn1です。

の 2 つの行の値は次の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=ただし、フィールドの合計文字数を知る必要はありません。;

以前にセミコロンで区切られた複数の値を持つ列を扱ったことがないので、知る必要があることを照会する方法がわかりません。

4

3 に答える 3

1

column1 内に常に同じ部分が同じ順序であると仮定すると、次のよう
where ( CharIndex('years_active=',column1) - CharIndex('message=',column1) ) >50
になります (説明の長さを調整するか、調整するなど)。

于 2013-03-08T21:08:16.353 に答える
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
于 2013-03-08T21:21:30.950 に答える
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))
于 2013-03-08T21:05:44.980 に答える