SQL запрос точный поиск, чем другие - PullRequest
1 голос
/ 06 мая 2019

У меня есть таблица, которая имеет много столбцов.Но мы рассмотрим здесь 2 столбца.Имя Столбец1 и Столбец2 .И имя таблицы WordTable .Я просто хочу найти 50 баз записей по этим двум столбцам, которые соответствуют приведенным ниже.

Если я введу "auto ", то результат должен быть.

"auto"
"autoa"
"autoab"
.
.
.
Etc

ЕслиЯ ввожу "maver" , результат должен быть

"maver"
"mavera"
"maverr"
"maverx"
"maverydsdb"

Значит Первое слово должно точно соответствовать остальной части после возрастания.И матч должен быть сделан из любой колонны буксира.

Ниже приведен мой запрос, но он не работает.

searchWord(value) async {
    var res = await db.rawQuery("SELECT *
    FROM WordTable
    WHERE (Column1 LIKE '$value%' OR Column2 LIKE '$value%')
    ORDER BY Column1 ASC, Column2 ASC
    LIMIT 50");

    List<Word> list =
    res.isNotEmpty ? res.map((c) => Word.fromJson(c)).toList() : [];
    return list;
  }

Получение результата, но не в ожидаемом порядке.

Где я ошибаюсь?Просьба направлять меня.

Я пришел с мобильной платформы и использую базу данных "SQFLite", поэтому для меня важен запрос.

Ответы [ 3 ]

2 голосов
/ 06 мая 2019

Здесь есть две хитрости.Первый - это упорядочить по чему-то, чего на самом деле нет в таблице, то есть по части слова после «$ value».Вы можете использовать sqlite substr и sqlite length , чтобы найти эту часть, что-то вроде substr(column,length($value)).Поскольку желаемым результатом является «целое» слово, его можно объединить с оператором конкатенации ||, что-то вроде $value||substr(column,length($value)).

Второй трюк заключается в выборе column1 ИЛИ column2 в том же поле результатов, чтобы их можно было упорядочить как один столбец.Один из способов сделать это - запрос UNION.

С такими данными:

column1     column2
----------  ----------
autob       autoa
mavery      autoc
maverz      mavera
autoz       maverq
autoa       autob

Этот запрос:

select 'auto'||substr(column1,length('auto') + 1) word
from wordTable
where column1 like 'auto%'
UNION
select 'auto'||substr(column2,length('auto')+1)
from wordTable
where column2 like 'auto%'
order by 1

Возвращает результат:

word
----------
autoa
autob
autoc
autoz

ADDENDUM

После дальнейших размышлений я, скорее, опустошил его.Первый «трюк» является спорным, если вы используете UNION с соответствующими «словами» в том же столбце результата, что и:

SELECT column1,* 
from wordTable
where column1 like '$value%'
UNION
SELECT column2,*
from wordTable
where column2 like '$value%'
ORDER BY 1
1 голос
/ 06 мая 2019

Я думаю, вам нужно использовать + строку подключения, чтобы заполнить ваш параметр, иначе вы будете выполнять только этот sql.

SELECT * FROM WordTable WHERE (Column1 LIKE '$value%' OR Column2 LIKE '$value%') ORDER BY Column1 ASC, Column2 ASC LIMIT 50

Я не уверен, какой язык вы используете, я бы посоветовал вам использовать параметры, чтобы избежать sql-инъекций.

"SELECT * FROM WordTable WHERE (Column1 LIKE '"+$value+"%' OR Column2 LIKE '"+$value%+"') ORDER BY Column1 ASC, Column2 ASC LIMIT 50"
0 голосов
/ 06 мая 2019

Вы можете попробовать этот код для заказа:

SELECT *
FROM WordTable
WHERE (Column1 LIKE '$value%' OR Column2 LIKE '$value%')
ORDER BY Column1 = '$value' DESC, Column1 LIKE '$value%' DESC, 
Column2 = '$value' DESC, Column2 LIKE '$value%' DESC, 
Column1 ASC, Column2 ASC
LIMIT 50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...