SQL查询 - String Permutations

时间:2009-06-10 11:30:50

标签: sql string permutation

我正在尝试使用OpenOffice上的db创建查询,其中在查询中输入字符串,并在数据库中搜索字符串的所有排列并显示匹配项。我的数据库有一个单词及其定义的字段,所以如果我正在寻找好,我会得到它的定义以及DOG的定义。

4 个答案:

答案 0 :(得分:2)

您还需要第三列。在本专栏中,您将获得单词 - 但字母按字母顺序排序。例如,您将获得单词APPLE,并在下一列中使用单词AELPP。 您可以对要查找的单词进行排序 - 并运行一些SQL代码,如

WHERE sorted_words = 'my_sorted_word'

对于苹果这个词,你会得到这样的东西:


unsorted      sorted
AELPP         APPLE
AELPP         PEPLA
AELPP         APPEL 

现在,你也想要 - 如果我错了就纠正我,但是你想要所有可以用**组合**的单词,这意味着APPLE也会返回像LEAP和PEA这样的词。

要做到这一点,你必须使用一些编程语言 - 你必须编写一个递归执行上述函数的函数,例如 - 对于你有的单词AELLP

  • ELLP
  • ALLP
  • AELP 等等..(每次减去每个组合中的一个字母,然后在每个组合中可能有两个字母等等。)

答案 1 :(得分:0)

基本上,您无法在单个SQL语句中轻松进行排列。您可以使用其他语言轻松完成它们,例如,在C#中如何执行此操作:http://msdn.microsoft.com/en-us/magazine/cc163513.aspx

答案 2 :(得分:0)

好的,我认为可以处理所有情况的更正版本。这将在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))

答案 3 :(得分:0)

maybe this can help:

假设您有一个带整数的辅助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)