我正在尝试使用 OpenOffice 上的数据库创建查询,其中在查询中输入字符串,并在数据库中搜索字符串的所有排列并显示匹配项。我的数据库有一个单词及其定义的字段,所以如果我正在寻找 GOOD,我会得到它的定义以及 DOG 的定义。
4 回答
您还需要第三列。在本专栏中,您将看到单词 - 但字母按字母顺序排序。例如,您将拥有单词 APPLE,并且在下一列中使用单词 AELPP。您将对要查找的单词进行排序 - 并运行一些 SQL 代码,例如
WHERE sorted_words = 'my_sorted_word'
对于苹果这个词,你会得到这样的东西:
unsorted sorted
AELPP APPLE
AELPP PEPLA
AELPP APPEL
现在,您还想要 - 如果我错了,请纠正我,但是您想要所有可以用 ** 字母的任意组合 ** 组成的单词,这意味着 APPLE 还返回 LEAP 和 PEA 之类的单词。
为此,您必须使用某种编程语言 - 例如,您必须编写一个以递归方式执行上述操作的函数 - 对于您拥有的单词 AELLP
- ELLP
- 阿尔普
- AELP等等..(每次在每个组合中减去一个字母,然后在每个可能的组合中减去两个字母等......)
好的,我认为可以处理所有情况的更正版本。这将在 MS SQL Server 中工作,因此您可能需要针对您的 RDBMS 对其进行调整,以使用本地表和 REPLICATE 函数。它假定一个名为@search_string 的传递参数。此外,由于它使用的是 VARCHAR 而不是 NVARCHAR,因此如果您使用扩展字符,请务必更改它。
我现在想的最后一点......它将允许重复字母。例如,即使“GOOD”中只有一个“D”,“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))
假设您有一个带有整数的辅助 Numbers 表。
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