2013-03-08 27 views
1

我不是數據庫管理員,但我經常需要查詢數據庫才能完成我的工作。最近我的任務是查詢數據庫列中分號分隔表達式的長度。它可能會更容易顯示爲一個製作的示例表格和列:如何在SQL Server 2008中找出列中表達式的長度

  • 表是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=之間和;

我從來沒有處理過多個由分號分隔的值之前,所以我不知道如何查詢我需要知道的。

+2

這就是爲什麼使用多值字段是一個壞主意 – Kira 2013-03-08 21:10:46

+0

確實 - 參考「但我經常需要查詢數據庫來做我的工作。最近我的任務是......「:) – 2013-03-08 21:13:32

回答

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)) 
1

假設總是有列1中相同的部件,以相同的順序,一些
where (CharIndex('years_active=',column1) - CharIndex('message=',column1) ) >50
(給予或採取一些調整長度的描述等)

+0

ps這些都不是真正的表格/欄目,我只是爲了避免放入真實的公司數​​據而做出來的,如果有人想知道我爲什麼需要這些信息,那是因爲有一個程序可以接收消息數據並將其放入新數據庫的新表中,但有時會失敗,因爲新表只有varchar(50)。我的下一個作業在識別出有問題的行後,將查找一種在數據遷移之前截斷字符串的方法。 – 2013-03-08 21:10:27

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 
相關問題