sql查询比其他查询更精确

时间:2019-05-06 08:34:35

标签: sql sqlite

我的表有很多列。但是我们在这里考虑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”数据库,因此查询对我来说很重要。

3 个答案:

答案 0 :(得分:2)

这里有两个技巧。第一种是按表中实际上不存在的东西排序,即单词“ $ value”后面的部分。您可以使用sqlite substrsqlite length查找该部分,类似于substr(column,length($value))。由于所需的结果是“整个”字,因此可以将其与串联运算符||放在一起,例如$value||substr(column,length($value))

第二个技巧是在同一结果字段中选择column1column2,以便将它们作为一列进行排序。一种实现此目的的方法是使用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