我的表有很多列。但是我们在这里考虑2列。 名称为 Column1 和 Column2 。表格名称为 WordTable 。我只想在匹配如下的2列中搜索50个记录库。
如果我输入“自动”,那么结果应该是。
"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”数据库,因此查询对我来说很重要。
答案 0 :(得分:2)
这里有两个技巧。第一种是按表中实际上不存在的东西排序,即单词“ $ 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
添加
经过进一步的思考,我宁愿推翻它。如果在与以下相同的结果列中使用带有匹配的“单词”的UNION,则第一个“把戏”是没有意义的:
SELECT column1,*
from wordTable
where column1 like '$value%'
UNION
SELECT column2,*
from wordTable
where column2 like '$value%'
ORDER BY 1
答案 1 :(得分:1)
我认为您需要使用+
连接字符串来填充参数,否则您将只执行此sql。
SELECT * FROM WordTable WHERE (Column1 LIKE '$value%' OR Column2 LIKE '$value%') ORDER BY Column1 ASC, Column2 ASC LIMIT 50
我不确定您使用哪种语言,我建议您使用参数来避免sql-injection。
"SELECT * FROM WordTable WHERE (Column1 LIKE '"+$value+"%' OR Column2 LIKE '"+$value%+"') ORDER BY Column1 ASC, Column2 ASC LIMIT 50"
答案 2 :(得分:0)
您可以尝试以下代码进行订购:
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