文字列がクエリに入力される OpenOffice でデータベースを使用してクエリを作成しようとしています。文字列のすべての順列がデータベースで検索され、一致が表示されます。私のデータベースには単語とその定義のフィールドがあるため、GOOD を探している場合は、その定義と DOG の定義を取得します。
4 に答える
3 列目も必要です。この列には単語が表示されますが、文字はアルファベット順に並べられています。たとえば、APPLE という単語があり、次の列には AELPP という単語があります。探している単語を並べ替えて、次のような SQL コードを実行します。
WHERE sorted_words = 'my_sorted_word'
単語appleの場合、次のようになります。
unsorted sorted
AELPP APPLE
AELPP PEPLA
AELPP APPEL
さて、あなたも欲しがっていました-私が間違っていたら訂正してください。ただし、文字の**任意の組み合わせ**で作成できるすべての単語が必要です。つまり、APPLE は LEAP や PEA などの単語も返します。
これを行うには、いくつかのプログラミング言語を使用する必要があります-たとえば、上記を再帰的に実行する関数を作成する必要があります-AELLPという単語に対して
- ELLP
- ALP
- AELPなど..(毎回、すべての組み合わせで1文字を減算し、次に可能なすべての組み合わせで2文字を減算する..)
整数の補助数値テーブルがあるとします。
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)
基本的に、単一の SQL ステートメントで順列を簡単に実行することはできません。ただし、別の言語で簡単に実行できます。たとえば、C# で実行する方法は次のとおりです: http://msdn.microsoft.com/en-us/magazine/cc163513.aspx
わかりました、すべての状況を処理すると思う修正版。これは MS SQL Server で機能するため、ローカル テーブルと REPLICATE 関数を使用する限り、RDBMS に合わせて調整する必要がある場合があります。これは、@search_string というパラメーターが渡されることを前提としています。また、NVARCHAR の代わりに VARCHAR を使用しているため、拡張文字を使用している場合は必ず変更してください。
私が今考えている最後のポイントは... 文字の重複を許可することです. たとえば、"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))