programing

SQL에서 Lef-most 조건을 충족하는 첫 번째 레코드를 가져오는 중

minecode 2022. 10. 31. 21:18
반응형

SQL에서 Lef-most 조건을 충족하는 첫 번째 레코드를 가져오는 중

컬럼에서 특정 값(say word)을 검색하는 것이 주된 목표입니다.존재하지 않는 경우 단어% 또는 wor% 또는 wo% 또는 w%일치하는 첫 번째 항목을 찾습니다.

"English"에서 쿼리는 다음과 같이 표시됩니다. "word를 찾고 있으면 반환합니다.그렇지 않으면 'word'와 최대 접두사가 같은 첫 번째 단어를 찾습니다.

나는 쓸 수 있다

SELECT word FROM words WHERE word = 'word' or word LIKE 'word%' or ... LIMIT 1;

알파벳 순으로 주문하려고 했는데 안 돼요.또한 역순으로 정렬할 수 없습니다. 그렇지 않으면 'wordy'가 'word' 앞에 나옵니다.

현재 제 생각은 데이터베이스를 n번 호출하는 것입니다. 여기서 n = length(word)입니다.하지만 SQL에 정확히 MySQL/MariaDB라는 '단락 OR'이 있는지 알고 싶습니다.

DB에 'w', 'word', 'wording'이 있으며, 'word'로 검색하고 'word'만 검색하려고 합니다.

DB에 'z', 'zab', 'zac', 'ze', 'zeb'이 있으며 'zab'을 검색하여 'zab'을 얻으려고 합니다.

문자열 거리 알고리즘을 찾고 있는 것처럼 들리는데요.문자열 거리 알고리즘은 현재 단어를 원하는 단어로 변경하는 데 필요한 변경 수를 나타냅니다.그 아이디어는 모든 단어에 문자열 거리를 두고 거리를 두고 그 거리에 따라 정렬하는 것입니다.정확히 일치하면 0이 되고 누락된 문자 또는 추가 문자가 1이 됩니다.

당신의 질문에 대한 정확한 답은 아니지만, 나는 그것이 당신이 실제로 찾던 것이기를 바랍니다.이것과 잘 어울리는 단어 줄기에 관심이 있을지도 모릅니다.

편집

당신의 실제 질문에 대한 해결책으로 제 답변을 확장합니다.기능 추가:

CREATE FUNCTION `WORDRANK`(`a` VARCHAR(150), `b` VARCHAR(150)) RETURNS INT
BEGIN
    DECLARE rank INT DEFAULT 0;

    WHILE rank < LENGTH(a) DO
        IF rank = 0 AND b = a THEN RETURN rank;
        ELSEIF rank = 0 AND b LIKE CONCAT(a, "%") THEN RETURN rank + 1;
        ELSEIF b LIKE CONCAT(LEFT(a, LENGTH(a) - rank), "%") THEN RETURN rank + 2;
        END IF;
        SET rank = rank + 1;
    END WHILE;

    RETURN rank + 100;
END

그런 다음 저장 프로시저를 만듭니다.

CREATE PROCEDURE `getClosestMatch`(IN `q` VARCHAR(150))
BEGIN
    SELECT
        word
    FROM words
    WHERE word LIKE CONCAT(LEFT(q, 1),"%")
    ORDER BY WORDRANK(q, word), word
    LIMIT 1;
END

원하는 결과를 얻기 위해서는 WORDRANK 함수에서 정의한 원하는 알고리즘에 따라 각 워드의 순위를 매겨야 합니다.저장 프로시저는 쿼리를 실행하는 일반적인 방법을 가지고 있습니다.

전제 조건:단어는 ASCII, 최소 길이 = 1, 최대값 < 'ZZ'입니다.전제 조건: VARCHAR 입력, 트레일 스페이스 없음.가정: 'word'가 없지만 'wording'과 'wordy'가 있다면, 'wordy'가 아니라 'wording'을 원합니다.단순하지는 않지만 단일 SELECT 문장으로...

set @x = 'w'; /* or whatever word you want to search with */
 select * from words
 where word <= concat(@x,'zz')
 and (word like concat(@x,'%') or @x like concat(word,'%'))
 order by length(word) <> length(@x),
 case when length(word) = length(@x) then 1 else 0 end asc,
 case when length(word) > length(@x) then word else 'zz' end asc,
 word desc limit 1;

다음 쿼리를 시도합니다.

SELECT word 
  FROM words
 WHERE word LIKE 'w%'
ORDER BY word;

언급URL : https://stackoverflow.com/questions/43441406/getting-first-record-that-satisfies-lef-most-condition-in-sql

반응형