2012-04-17 9 views
0

私はスペイン語で単語を含むSQL Server 2005のデータテーブルを持っています。私は各単語を一列に格納しています。 文字配列が与えられているので、これらの文字を含むすべての単語を検索したいと思います。たとえば、「avi」は「avion」と「iva」と一致します。出来ますか? ご協力いただきありがとうございます。Sql Serverで任意の順序で文字を検索します

+1

すべての文字を一致させますか? 「vi」または「avxi」を返す必要がありますか? –

+0

こんにちは: はい、どの述語が表示されていても、述語を含むすべての単語を取得したいと思います。 – Oscar

+0

単語にはすべての文字が含まれていなければなりません ? –

答えて

2

最も簡単なことは、分割してピボットしてから結合することです。

だから、aviファイルが文字テーブルに3行次のようになります。そして、

a 
v 
i 

この例ではHAVING COUNT(*) = (SELECT COUNT(*) FROM letters)

で使用GROUP BY wordINNER JOIN ON CHARINDEX(letter, word) > 0

で単語リストに

に参加し、私はここでSplit a string into individual characters in Sql Server 2005からcteを拾って修正した数字の表を丸めます(しかし、私は通常、数字の表を使ってピボットを行います)。

http://data.stackexchange.com/stackoverflow/query/67103/http-stackoverflow-com-questions-10199927-find-chars-in-any-order-in-sql-server

DECLARE @t AS TABLE (search varchar(100)); 
INSERT INTO @t VALUES ('avi'); 

DECLARE @words AS TABLE (word varchar(100)); 
INSERT INTO @words VALUES ('avion'), ('iva'), ('name'); 
with cte as 
(
    select substring(search, 1, 1) as letter, 
     stuff(search, 1, 1, '') as search, 
     1 as RowID 
    from @t 
    union all 
    select substring(search, 1, 1) as letter, 
     stuff(search, 1, 1, '') as search, 
     RowID + 1 as RowID 
    from cte 
    where len(search) > 0 
) 
,letters AS (
    SELECT DISTINCT letter FROM cte 
) 
SELECT words.word 
FROM letters 
INNER JOIN @words AS words 
    ON CHARINDEX(letter, word) > 0 
GROUP BY words.word 
HAVING COUNT(*) = (SELECT COUNT(*) FROM letters) 
+0

こんにちは: あなたの助けをいただきありがとうございます。 downvoteのコメント – Oscar

0

なぜ:

SELECT * FROM words WHERE word LIKE '%a%' AND word LIKE '%v%'AND word LIKE '%i%' 

あなたは1M行(使用しているサーバーに応じて)>でそれを使うべきではありませんので、これは、 "たくさん" のリソースを消費します。

+0

? – Philipp

+1

このオプションは本当に悪い性能を持っています... – Oscar

+0

はい、あなたが私が書いたものを読んで...私はそれが何の目的かわかりませんが、それが単なる選択のためのものなら... – Philipp

関連する問題