MSSQL выбрать ближайшее совпадение (id) указанного условия - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть таблица, заполненная несколькими словами разной длины.

ID | WORD  | LENGTH  
1  | able  |   4
2  | acid  |   4
3  | about |   5
.....

метод в C # генерирует случайное число, и я хочу получить слово с ближайшим соответствием длины и идентификатора. Недавно я использую этот запрос

select top 1 word from vocabulary where length = 4 and id <= 3;

Проблема в том, что таким образом всегда возвращается первое вхождение слова из 4 букв. Это не то, что мне нужно.

Я не могу использовать это:

select top 1 word from vocabulary where length = 4 and id <= 3;

потому что, когда случайное число близко к последнему идентификатору в таблице, может случиться, что не будет другого слова с запрошенной длиной. (например,

 select top 1 word from vocabulary where length = 4 and id >= 2; 

не сможет найти совпадение.

Есть ли способ, как выбрать 1 значение, которое имеет ближайшее совпадение в запрошенном направлении? <= или> =

Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Не уверен, что крайне важно получить строку на основе внешне сгенерированного случайного числа, но если вам просто нужно случайное слово заданной длины, вы можете сделать что-то вроде этого ...

Установка:

DROP TABLE IF EXISTS DICTIONARY;

CREATE TABLE DICTIONARY (

    ID int,
    WORD nvarchar(255),
    LENGTH AS LEN(WORD),

    CONSTRAINT DICTIONARY_PK PRIMARY KEY (ID),

);

CREATE INDEX DICTIONARY_I1 ON DICTIONARY (LENGTH) INCLUDE (WORD);

INSERT INTO DICTIONARY (ID, WORD) VALUES
    (1, 'able'),
    (2, 'acid'),
    (3, 'about'),
    (4, 'boss'),
    (5, 'brain'),
    (6, 'child'),
    (7, 'computer'),
    (8, 'hint'),
    (9, 'human'),
    (10, 'ichthyosaur'),
    (11, 'mother'),
    (12, 'otorhinolaryngologist');

Запрос на получение случайной строки заданной длины (в данном примере 4):

DECLARE @length int = 4;

SELECT TOP 1 * FROM DICTIONARY WHERE LENGTH = @length ORDER BY NEWID();

План запроса хорош, что может быть важно для большой таблицы и / или частых запросов:

Query Plan

0 голосов
/ 04 сентября 2018
declare @vocabulary table (ID int, Word varchar(max), LENGTH int)
insert into @vocabulary(ID,Word,LENGTH)values(1,'able',4),(2,'acid',4),(3,'about',5)
declare @random int = rand() * 10
select @random
select top 1 word from @vocabulary where LENGTH = 4 order by ABS(ID - @random)

Результатом является ближайший идентификатор из случайного числа

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