0

何百万ものメッセージを含むテーブルがあります。これらの各メッセージからストップワードのリストを削除したい-SQLで

入力例:

id  message
-------------------------------
1   we are on top of the world
2   too bad the apple is rotten
3   there is no I in team
4   it matters where you go to

削除するストップワード:

in, on, of, to, too

望ましい出力:

id  message
-------------------------------
1   we are top the world
2   bad the apple is rotten
3   there is no I team
4   it matters where you go

ここでの問題は、ストップワードがメッセージの最初、途中、または最後にある可能性があることだと思います。したがって、次のようなクエリで十分です。

UPDATE table SET message = REPLACE(message, ' in ', '');
UPDATE table SET message = REPLACE(message, ' on ', '');
UPDATE table SET message = REPLACE(message, ' of ', '');
etc...

より良い解決策はありますか?

4

2 に答える 2

5

メッセージの最初と最後でストップワードを更新できないという問題を回避するには、各メッセージの最初と最後にスペースを連結し、置換を実行してから、先頭をトリミングするだけです。 /末尾のスペースを元に戻します:

UPDATE tbl 
SET message = TRIM(REPLACE(CONCAT(' ', REPLACE(message, ' in ', ' in  '), ' '), ' in ', ''));

編集:no I in teamメッセージの途中にあるストップワードは、 ->で終わることを望まないため、置き換えられた後もスペースを保持する必要があることも考慮する必要がありますno Iteam。ストップワードの後に​​スペースを追加して右側に2つのスペースを追加することでこれを処理します...その後、置き換えられたときに、各側に1つのスペースがあるストップワードのみを置き換えるため、その余分なスペースは保持されます。


SQLFiddleデモ

于 2012-07-18T07:07:44.730 に答える
2

すべてのストップワードのリストを保持するフィールド stopword を含む stopwords というテーブルを作成すると、次のように実行できます。

CREATE TABLE [dbo].[stopwords](
    [stopword] char(100) NOT NULL
) 

insert into stopwords values ('in');
insert into stopwords values ('on');
insert into stopwords values ('of');
insert into stopwords values ('to');
insert into stopwords values ('too');

-- DEBUG: select message ,stopword, replace(message,CONCAT(' ', stopword , ' '), ' ')
update table 
set message = trim(replace(CONCAT(' ',message, ' '),CONCAT(' ',stopword,' '),' ')) 
from stopwords
where CONCAT(' ', message , ' ')  like CONCAT('% ' ,stopword , ' %')
于 2012-07-18T07:25:05.200 に答える