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
'programing' 카테고리의 다른 글
JUnit 5에서는 모든 테스트 전에 코드를 실행하는 방법 (0) | 2022.10.31 |
---|---|
Comparator를 사용하여 커스텀 정렬 순서를 정의하려면 어떻게 해야 합니까? (0) | 2022.10.31 |
URL Connection이란 정확히 어떤 것입니까?setDoOutput()이 영향을 미칩니까? (0) | 2022.10.22 |
pip이 패키지를 설치했지만 명령줄에서 실행 파일을 찾을 수 없습니다. (0) | 2022.10.22 |
JavaScript는 참조로 전달됩니까? (0) | 2022.10.22 |