【问题标题】:Node.js + Postgres highest matching to lowest matchig datasNode.js + Postgres 最高匹配到最低匹配数据
【发布时间】:2013-12-13 03:27:35
【问题描述】:

在我的节点应用程序中,我正在执行一个选择查询。假设考虑用户将输入作为“abcdef”。我将从该字符串中获取前 4 个字母,例如“abcd”,并且我将检查匹配“abcd”的条目使用ILIKE 命令。

我的查询是:

client.query("select * from tn_village where level3 ILIKE '%"+substring+"%' OR level4 ILIKE '%"+substring+"%' OR level5 ILIKE '%"+substring+"%' OR level6 ILIKE '%"+substring+"%' OR level7 ILIKE '%"+substring+"%' OR level8 ILIKE '%"+substring+"%' OR level9 ILIKE '%"+substring+"%'" ,function(err,result)
{

res.send(result);
});

这里的子字符串是“abcd”..我按字母顺序得到结果。. But what i want is i have to show the row which is exactly matching first say row for "abcde" first and then the remaining results,,

帮我解决这个问题..提前谢谢..

【问题讨论】:

  • 你能说说为什么它被否决了吗??
  • 不知道为什么你被否决了。该查询不包含 order by 子句,因此您可能并不完全清楚您已经尝试过什么(尽管提到您在文本中进行了字母排序)并且看起来可能有一些无关的信息(例如提到您正在使用子字符串)。无论哪种方式,希望我的回答有所帮助。
  • 哦,请确保您正在清理您的输入 - 如果您只是像这样将子字符串嵌入到查询中而不采取任何预防措施(例如使用占位符而不是字符串连接),那么您正在暴露自己进行 sql 注入。

标签: node.js postgresql


【解决方案1】:

您可以进行两级排序,第一级用于区分完全匹配和部分匹配,第二级用于按字母顺序排序。例如,

order by case when test_column = input_string then 0
              else 1 end,
         input_string

对于完全匹配,该排序的第一级将为 0,否则为 1。这样,如果一行完全匹配,则 case 语句的计算结果为 0,这将把该行放在不精确匹配之前,case 语句的计算结果为 1。然后,对于所有不精确匹配的行,第一个排序级别将是相同 (1),但第二级可能不同,将简单地给出这些行的字母排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-08
    • 2016-01-26
    • 2017-02-08
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多