SQL-запрос - Строковые перестановки - PullRequest
1 голос
/ 10 июня 2009

Я пытаюсь создать запрос с использованием базы данных в OpenOffice, где в запросе вводится строка, а все перестановки строки ищутся в базе данных и отображаются совпадения. В моей базе данных есть поля для слова и его определения, поэтому, если я ищу ХОРОШО, я получу его определение, а также определение для СОБАКИ.

Ответы [ 4 ]

2 голосов
/ 10 июня 2009

Вам также понадобится третий столбец. В этом столбце у вас будет слово - но с буквами, отсортированными в алфавитном порядке. Например, у вас будет слово APPLE, а в следующем столбце слово AELPP. Вы бы отсортировали искомое слово и запустили какой-нибудь код SQL, например

WHERE sorted_words = 'my_sorted_word'

для слова яблоко, вы получите что-то вроде этого:


unsorted      sorted
AELPP         APPLE
AELPP         PEPLA
AELPP         APPEL 

Теперь вы также хотели - поправьте меня, если я ошибаюсь, но вы хотите, чтобы все слова, которые можно сделать с ** любой комбинацией ** букв, означают, что APPLE также возвращает такие слова, как LEAP и PEA. *

Чтобы сделать это, вам придется использовать некоторый язык программирования - вам нужно будет написать функцию, например, для рекурсивного преобразования вышеупомянутого - для слова AELLP у вас есть

  • ELLP
  • ALLP
  • AELP и так далее ... (каждый раз вычитая одну букву в каждой комбинации, а затем две буквы в каждой комбинации, возможной и т. д.)
0 голосов
/ 01 июля 2009

может быть, это может помочь:

Предположим, у вас есть вспомогательная таблица номеров с целыми числами.

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)
0 голосов
/ 10 июня 2009

Хорошо, исправленная версия, которая, я думаю, обрабатывает все ситуации. Это будет работать в MS SQL Server, поэтому вам может потребоваться настроить его для вашей СУБД, используя локальную таблицу и функцию REPLICATE. Предполагается, что переданный параметр называется @search_string. Кроме того, поскольку он использует VARCHAR вместо NVARCHAR, если вы используете расширенные символы, обязательно измените это.

Последний момент, о котором я сейчас думаю ... это позволит дублировать буквы. Например, «GOOD» найдет «DODO», хотя в «GOOD» есть только одна «D». Он не найдет слова большей длины, чем ваше оригинальное слово. Другими словами, пока он найдет «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 голосов
/ 10 июня 2009

В принципе, вы не можете легко делать перестановки в одном операторе SQL. Вы можете легко сделать это на другом языке, например, вот как это сделать в C #: http://msdn.microsoft.com/en-us/magazine/cc163513.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...