开发者

SQL Server 2008 update one column with a value based on number words in other

开发者 https://www.devze.com 2022-12-29 18:46 出处:网络
Columns Words, WordsCount For each value of Words \"x y z\" update wordscount with 3 , \"a b\"with 2, \"a b c d\" with 4 and etc...

Columns Words, WordsCount

For each value of Words "x y z" update wordscount with 3 , "a b" with 2, "a b c d" with 4 and etc...

How can I do it开发者_如何学C with/without .Net program ?


If you can count on all words always being separated by one space:

UPDATE table SET WordCount = (LEN(Words) - LEN(REPLACE(Words, ' ', ''))) + 1

This breaks when there is nothing or NULL in Words, but you get the idea..


You might be able to do this with a split function where you split on a space:

Create FUNCTION [dbo].[udf_Split] (@DelimitedList nvarchar(max), @Delimiter nvarchar(2) = ',')
RETURNS @SplitResults TABLE (Position int NOT NULL PRIMARY KEY, Value nvarchar(max))
AS
Begin
    Declare @DelimiterLength int
    Set @DelimiterLength = DataLength(@Delimiter) / 2

    If Left(@DelimitedList, @DelimiterLength) <> @Delimiter
        Set @DelimitedList = @Delimiter + @DelimitedList

    If Right(@DelimitedList, @DelimiterLength) <> @Delimiter
        Set @DelimitedList = @DelimitedList + @Delimiter

    Insert @SplitResults(Position, Value)
    Select CharIndex(@Delimiter, A.list, N.Value) + @DelimiterLength            
        , Substring (
                    A.List
                    , CharIndex(@Delimiter, A.list, N.Value) + @DelimiterLength         
                    , CharIndex(@Delimiter, A.list, N.Value + 1)                            
                        - ( CharIndex(@Delimiter, A.list, N.Value) + @DelimiterLength ) 
                    )
    From dbo.Numbers As N
        Cross Join (Select @DelimitedList As list) As A
    Where N.Value > 0
        And N.Value < LEN(A.list)
        And Substring(A.list, N.Value, @DelimiterLength) = @Delimiter
    Order By N.Value

    Return
End

Update Table
Set WordCount = (
                Select Count(*)
                From dbo.udf_Split(Table.WordlistCol, ' ')
                )

This version of a split function relies on the existence of a Numbers table which contains a sequential list of integer values.

0

精彩评论

暂无评论...
验证码 换一张
取 消