将布尔文本搜索转换为 SQL 查询 WHERE 子句

我们希望实现一个搜索查询,该查询将对 SQL 中的特定列进行全文搜索。我们可以SQL直接或C#按照下面的 TomC 建议进行操作。查询将由用户输入,例如 -

(A AND B) OR (C AND D)

我们想将此搜索文本转换为 SQL 查询,如下所示 -

WHERE (col LIKE '%A%' AND col LIKE '%B%') OR (col LIKE '%C%' AND col LIKE '%D%')

请告知处理此问题的最佳方法是什么。


jeck猫
浏览 197回答 2
2回答

凤凰求蛊

在数据库方面,CONTAINS如果您正在寻找模糊或不太精确的匹配,我会使用。我会提到这一点,以防您将原始帖子简单化。与LIKE领先的通配符不同,它可以使用INDEX使速度更快的an 。LIKE以这种方式使用将导致表扫描。您必须创建FULLTEXT INDEX要使用的CONTAINS.另一种方法是使用CHARINDEX. 这可以使用索引,但不能保证。与LIKE您的环境相比,我会对此进行测试。where        (charindex('A',col) > 0 and charindex('B',col) > 0)     or (charindex('C',col) > 0 and charindex('D',col) > 0)

慕森卡

我不知道这是否是最好的正则表达式替换,但它有效using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;namespace ConsoleApplication58{    class Program    {        static void Main(string[] args)        {            string pattern = @"(?'prefix'[^\w]+)?(?'var1'\w+)(?'operator'\s+(AND|OR)\s+)(?'var2'\w+)(?'suffix'.*)?";            string input = "(A AND B) OR (C AND D)";            Match match = null;            do            {                match = Regex.Match(input, pattern);                if (match.Success) input = Regex.Replace(input, pattern, ReplaceVars(match));            } while (match.Success);        }        public static string ReplaceVars(Match m)        {            return m.Groups["prefix"] + "col LIKE %'" + m.Groups["var1"].Value + "'" + m.Groups["operator"] + "col LIKE %'" + m.Groups["var2"].Value + "'" + m.Groups["suffix"];        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP