2009-06-10 3 views
1

쿼리에 문자열을 입력하고 해당 문자열의 모든 순열을 데이터베이스에서 검색하고 일치 항목을 표시하는 OpenOffice에서 db를 사용하여 쿼리를 만들려고합니다. 내 데이터베이스에는 단어와 정의에 대한 필드가 있으므로 GOOD을 찾고 있다면 DOG에 대한 정의와 정의를 가져올 것입니다.SQL 쿼리 - 문자열 순열

답변

2

세 번째 열도 필요합니다. 이 열에는 단어가 있지만 알파벳 순서로 정렬 된 문자가 있습니다. 예를 들어 APPLE이라는 단어가 있고 다음 열에 AELPP라는 단어가 있습니다. 당신은 당신이 찾고있는 단어를 정렬 할 것 -이 같은 얻을 것,

단어 사과에 대한 WHERE sorted_words = 'my_sorted_word'

같은 일부 SQL 코드를 실행 : 이제


unsorted  sorted 
AELPP   APPLE 
AELPP   PEPLA 
AELPP   APPEL

을, 당신은 또한 원 - 내가 틀렸다면 나에게 맞는 말을해라. 그러나 글자의 조합 **으로 만들 수있는 모든 단어를 원한다. APPLE은 또한 LEAP와 PEA와 같은 단어를 반환한다.

이렇게하려면, 당신은 어떤 프로그래밍 언어를 사용하는 것이다 - 당신이

  • ELLP
  • ALLP이 AELLP 단어를 위해 - 당신이 예를 들어, 위의 재귀 적으로 미리 형성하는 함수를 작성해야
  • AELP 등등 ..
0

O (마다 .. 요법 가능한 모든 조합하여 두 개의 문자 조합마다 하나 개의 문자를 감산 한) k, 모든 상황을 처리한다고 생각되는 수정 된 버전. 이것은 MS SQL Server에서 작동하므로 로컬 테이블과 REPLICATE 함수를 사용하는 한 RDBMS에 맞게 조정해야합니다. @search_string이라는 전달 된 매개 변수를 가정합니다. 또한 NVARCHAR 대신 VARCHAR를 사용하므로 확장 문자를 사용하는 경우이를 변경해야합니다.

내가 지금 막 생각하고있는 마지막 요점은 ... 편지의 중복을 허용 할 것입니다. 예를 들어 "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)) 
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)