I am trying to update a table with ALL pattern matches in a string. I have three tables.
1 - 'Stack' Containing my Circumstance -- This is a long string free text field
2 - 'WordMatches' Contains a list of words of interest to me
3 - 'WordExclude' Contains the strings to exclude where a match occurs
I would like to PRINT each matched word into a new column and count the number of matched words. The nature and number of words is of importance to the work I am doing.
For example, Stack
| Circumstance |
|---|
| The police were called |
| Ice froze the door shut and wind blew the roof off |
Word Match
| WordMatchID | Word Match |
|---|---|
| 1 | Blew |
| 2 | Froze |
| 3 | Ice |
| 4 | Wind |
Word Exclude
| WordExcludeID | WordMatchID | Word Match |
|---|---|---|
| 1 | 3 | Police |
I want an output that looks like
| Circumstance | WordMatches | NoOfMatches |
|---|---|---|
| The police were called | NULL | 0 |
| Ice froze the door shut and wind blew the roof off | Blew, Froze, Ice, Wind | 4 |
I feel like this is a simple task but I cannot figure out a way for the LIKE operation to keep searching the string for multiple hits. All I have manage to achieve is flag a row which has at least one hit on the WordMatch table.
Any help would be much appreciated.
Thanks, Jack
CodePudding user response:
Here is one way to do it, note that the word ice matches in the word Police so I have a count of 1 there.
If you don't want that you could add a space before the values in table WordMatch
declare @Circumstance table (value varchar(100))
declare @WordMatch table (id int, wordmatch varchar(50))
insert into @Circumstance values ('The police where called'), ('Ice froze the door shut and wind blew the roof off')
insert into @WordMatch values (1, 'Blew'), (2, 'Froze'), (3, 'Ice'), (4, 'Wind')
select c.value,
( select string_agg(wm.wordmatch, ' ')
from @WordMatch wm
where CHARINDEX(wm.wordmatch, c.value) > 0
) words,
sum(case when CHARINDEX(wm.wordmatch, c.value) > 0 then 1 else 0 end)
from @Circumstance c
cross join @WordMatch wm
group by c.value
the result is
| value | words | count |
|---|---|---|
| Ice froze the door shut and wind blew the roof off | Blew Froze Ice Wind | 4 |
| The police where called | Ice | 1 |

