2009-06-10 7 views
1

クエリに文字列が入力され、文字列のすべての順列がデータベース内で検索され、一致が表示されるOpenOfficeのdb​​を使用してクエリを作成しようとしています。私のデータベースには単語とその定義のフィールドがあるので、GOODを探していればその定義とDOGの定義を取得します。SQLクエリ - 文字列の順列

答えて

2

3番目の列も必要です。この列には単語がありますが、アルファベット順にソートされています。たとえば、APPLEという単語があり、次の列にはAELPPという単語があります。 あなたがあなたの探している単語を並べ替えるだろう - あなたはこのようなものになるだろう、

ワードリンゴのためのWHERE sorted_words = 'my_sorted_word'

のようないくつかのSQLコードをして実行します。今


unsorted  sorted 
AELPP   APPLE 
AELPP   PEPLA 
AELPP   APPEL

を、あなたも欲しかったです - 私が間違っている場合は私を修正しますが、**あなたはLEAPとPEAのような単語を返すという意味で、**の文字の組み合わせ**で作ることができるすべての単語が欲しいです。

これを行うには、いくつかのプログラミング言語を使用する必要があります - あなたは

  • ELLP
  • ALLPを持ってAELLP単語を - あなたは、たとえば、上記の再帰的に予め形成された関数を記述する必要があります
  • AELP等..(各時間毎の組み合わせで一文字を減算し、.. ECT可能なすべての組み合わせで、2つの文字)
0

O k、私はすべての状況を処理すると思う修正版。これはMS SQL Serverで動作するので、ローカルテーブルとREPLICATE関数を使用する限り、RDBMSの調整が必要な場合があります。これは@search_stringという渡されたパラメータを前提としています。また、NVARCHARではなくVARCHARを使用しているので、拡張文字を使用している場合は、必ずそれを変更してください。

私が今考えている最後の1つの点は...文字の重複を許します。たとえば、「GOOD」に「D」が1つしかなくても、「GOOD」は「DODO」を検出します。それはあなたの元の単語よりも長い長さの単語を見つけることはありません。言い換えれば、「DODO」を見つけることはできるが、「DODODO」を見つけることはできない。たぶんこれはあなたの正確な要件にもよりますが、作業の出発点になります。ちょうどここでそれを持っている

DECLARE @search_table TABLE (search_string VARCHAR(4000)) 

DECLARE @i INT 

SET @i = 1 

WHILE (@i <= LEN(@search_string)) 
BEGIN 
    INSERT INTO @search_table (search_string) 
    VALUES (REPLICATE('[' + @search_string + ']', @i) 

    SET @i = @i + 1 
END 

SELECT 
    word, 
    definition 
FROM 
    My_Words 
INNER JOIN @search_table ST ON W.word LIKE ST.search_string 

私の編集前の元のクエリ、:

SELECT 
    word, 
    definition 
FROM 
    My_Words 
WHERE 
    word LIKE REPLICATE('[' + @search_string + ']', LEN(@search_string)) 
0

maybe this can help:

あなたは整数と補助番号のテーブルがあるとします。

DECLARE @s VARCHAR(5); 
SET @s = 'ABCDE'; 

WITH Subsets AS (
SELECT CAST(SUBSTRING(@s, Number, 1) AS VARCHAR(5)) AS Token, 
CAST('.'+CAST(Number AS CHAR(1))+'.' AS VARCHAR(11)) AS Permutation, 
CAST(1 AS INT) AS Iteration 
FROM dbo.Numbers WHERE Number BETWEEN 1 AND 5 
UNION ALL 
SELECT CAST(Token+SUBSTRING(@s, Number, 1) AS VARCHAR(5)) AS Token, 
CAST(Permutation+CAST(Number AS CHAR(1))+'.' AS VARCHAR(11)) AS 
Permutation, 
s.Iteration + 1 AS Iteration 
FROM Subsets s JOIN dbo.Numbers n ON s.Permutation NOT LIKE 
'%.'+CAST(Number AS CHAR(1))+'.%' AND s.Iteration < 5 AND Number 
BETWEEN 1 AND 5 
--AND s.Iteration = (SELECT MAX(Iteration) FROM Subsets) 
) 
SELECT * FROM Subsets 
WHERE Iteration = 5 
ORDER BY Permutation 

Token Permutation Iteration 
----- ----------- ----------- 
ABCDE .1.2.3.4.5. 5 
ABCED .1.2.3.5.4. 5 
ABDCE .1.2.4.3.5. 5 
(snip) 
EDBCA .5.4.2.3.1. 5 
EDCAB .5.4.3.1.2. 5 
EDCBA .5.4.3.2.1. 5 
(120 row(s) affected)