为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
jeck猫 2021-11-07 20:04:35
我们希望实现一个搜索查询,该查询将对 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%')请告知处理此问题的最佳方法是什么。
查看完整描述

2 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

在数据库方面,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)


查看完整回答
反对 回复 2021-11-07
?
慕森卡

TA贡献1806条经验 获得超8个赞

我不知道这是否是最好的正则表达式替换,但它有效


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"];

        }

    }

}


查看完整回答
反对 回复 2021-11-07
  • 2 回答
  • 0 关注
  • 194 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信