`
pedestrian_I
  • 浏览: 53383 次
  • 性别: Icon_minigender_1
  • 来自: 香港
社区版块
存档分类
最新评论

sql里做字符串的最佳匹配

阅读更多
之前有个项目要求做最佳匹配,要求如下
输入:字符串 比如31810484
输出:表Test中A字段与31810484最佳匹配的记录

最佳匹配的概念:
比如31810484,如果数据库里有
318
3181
31810
318104
3181048
那么应该选择与31810484最匹配的3181048做为输出

Step 1. 程序处理
接到这个需求之后,马上想到的是在程序里做比较,首先查询出所有的记录,然后拿目标串去匹配,匹配算法想的很简单.
1. 首先将数据库查询出的所有记录放在一个resultSet里面
2. 以某记录R的串长度(N)截取目标串前N位,如果截取后的串等于记录串R
3. 如果下一条匹配上的记录串比上一次的匹配记录串更长,则更新,一直找到最长匹配的那个为止.

这个代码写出来之后,逻辑上是OK的,后来代码检查时,发现这个效率实在是太低了,如果数据量小,OK. 如果数据量达到上千上万,效率就十分差了.

Step 2. 数据库处理
接着想,这个是数据库层面的事,应该由数据库来处理,于是花了一段时间去想写一个sql来处理这个需求,因数据库是oracle,我在这里写oracle版本

select * from (select * from Test where '31810484' like (A || '%') group by length(A) desc) where rownum <=1

这个sql能准确定位到最佳匹配.但是用了函数做为条件,效率也并不高.

Step 3. 加索引
给函数加索引,既是function base index.
于是加上了此索引
create index IDX_A_TEST ON Test (A || '%');
但是执行sql,发现还是很慢.
执行explain plan,发现此时还是全表扫描.
上网搜索才发现,原来需要设置些参数函数索引才会生效
ALTER SYSTEM SET QUERY_REWRITE_ENABLED=TRUE;
alter system set query_rewrite_integrity=trusted;
alter system set optimizer_mode=first_rows;
加上之后,速度提升了3-4倍,但是还是有点慢,还需要提高,继续跟进...
分享到:
评论

相关推荐

    解析SQL Server连接字符串信息 编程小实例,C++.net源代码编写

    在本实例中,我们将深入探讨如何解析SQL Server的连接字符串,这是一个编程任务,主要涉及C++和.NET框架。理解并正确处理连接字符串对于任何需要访问SQL Server数据库的应用程序都至关重要。 首先,SQL Server连接...

    Oracle拆分字符串,字符串分割的函数

    如果内置函数无法满足需求,可以创建自定义PL/SQL函数来实现特定的字符串拆分逻辑。 7. **示例应用** 例如,我们有一个以逗号分隔的字符串,如"apple,banana,orange",我们可以使用`instr()` 和 `substr()` 结合...

    C#检测是否有危险字符的SQL字符串过滤方法

    总的来说,C#中检测和过滤SQL字符串的方法是多样的,关键在于根据项目需求和安全策略选择合适的方法,并结合最佳实践,确保应用程序的健壮性和安全性。同时,定期进行安全审计和更新防护策略也是必要的,因为新的...

    将截断字符串或二进制数据,语句已终止,错误.rar

    在SQL Server等关系型数据库中,字符串数据通常存储在`VARCHAR`或`NVARCHAR`字段中,二进制数据存储在`VARBINARY`或`BLOB`类型字段中。每个字段都有预设的最大长度,当尝试存储的数据超过这个长度时,就会触发这个...

    在ASP中如何正确书写SQL字符串.rar

    正确地书写SQL字符串至关重要,因为它直接关系到程序的安全性和效率。以下是一些关键知识点: 1. **SQL注入防范**: SQL注入是常见的网络安全问题,攻击者通过输入恶意SQL代码,篡改原有的查询逻辑。要避免这种...

    JavaScript过滤SQL注入字符

    有一些JavaScript库,如jQuery、lodash等,提供了现成的字符串清理函数,可以帮助处理SQL注入。此外,一些专门的安全库,如OWASP Java Encoder或Esapi4js,提供了更全面的防御机制。 五、后端验证的重要性 尽管...

    SqlServer中用exec处理sql字符串中含有变量的小例子

    1. **声明变量**:`DECLARE`关键字用于声明变量,这里声明了两个变量,`@tssj`用于存储结果,`@Sql_Sql`用于存储动态生成的SQL字符串。 2. **设置SQL字符串**:`SET`语句用于赋值,这里将一个包含变量`@tssj`的SQL...

    SQL最佳实践

    SQL提供了丰富的内置函数,用于处理数据,包括数值函数、字符串函数、日期函数等。 - **数值函数**:如`ROUND`、`TRUNC`、`MOD`等,用于进行数学运算。 - **字符串函数**:如`SUBSTR`、`TRIM`、`UPPER`、`LOWER`等...

    数据库脚本sql

    7. **字符串处理的最佳实践** - 使用参数化查询避免SQL注入攻击。 - 当处理大量数据时,考虑批量操作以提高性能。 - 对于复杂的字符串处理,可能需要编写存储过程或使用用户自定义函数。 在数据库脚本中,熟练...

    在选定的列中查找多个字符串

    1. **使用LIKE运算符**:SQL的LIKE关键字是用于在WHERE子句中匹配字符串模式的。例如,假设我们有一个名为`Employees`的表,其中有一列`Name`,我们想找出所有名字包含“John”或“Jane”的员工,可以使用以下查询:...

    ASP.NET防止SQL注入函数

    该方法通过正则表达式与`StrKeyWord`和`StrRegex`进行匹配,如果发现输入字符串中含有SQL关键字或特殊字符,就认为可能存在SQL注入,并返回`true`。 除了`CheckRequestQuery`方法,类中还有一个未完成的`CheckForm`...

    android客户端实现模糊查找

    1. **字符串匹配算法**:在Android中,常见的字符串匹配算法有Levenshtein距离(编辑距离)、Jaccard相似度、BM25等。这些算法能计算字符串之间的相似度,帮助找出与查询关键词最接近的匹配项。例如,Levenshtein...

    登陆界面与SQL Server 2005 连接

    总结来说,通过C#与SQL Server 2005的集成,我们可以创建一个安全且有效的登录系统,但需要注意连接字符串的配置、SQL查询的编写以及用户认证的安全性。在实际操作中,还需要对给定的压缩包文件进行详细分析,理解其...

    本地动态SQL的开发

    - **`dynamic_string`**:表示SQL语句或PL/SQL块的字符串表达式。 - **`INTO`子句**:用于指定存储查询结果的变量或记录。 - **`USING`子句**:用于绑定参数,可以指定为输入(`IN`)、输出(`OUT`)或输入输出(`INOUT`)...

    一些有用的自定义配置单元udf函数、特殊数组、json、数学、字符串函数。___下载.zip

    除了Hive内置的字符串函数,如concat、substring、trim等,自定义字符串函数可能提供了更丰富的文本处理能力,如正则表达式匹配、字符串格式化、编码解码等。 总的来说,这个压缩包提供的资源对于Hive用户来说是一...

    详解MyBatis直接执行SQL查询及数据批量插入

    - **传入的SQL字符串**:必须按照"MyBatis能识别的格式"编写,如"select XXX as instanceid, XXX as instancename ....",这样才能自动将查询结果映射到Java对象。 - **#{}与${}的区别**:`#{}`用于预编译处理,...

    VB.NET操作SQL Server完全模块

    参数值为字符串,因此在SQL语句中使用单引号括起来。 #### GetIntByInt函数 与上一个函数类似,但参数值为整数,因此在SQL语句中不使用引号。 #### GetStrByStr函数 此函数也执行类似的查询,但返回的是字符串...

    SQL数据库自学资料

    22. **SQL TRIM**:用于删除字符串的前导和尾随空格。 23. **SQL CREATE TABLE**:用于创建新表。 24. **SQL CREATE VIEW**:用于创建虚拟表,即视图。 25. **SQL CREATE INDEX**:用于创建索引以提高查询速度。 ...

    mysql数据库sql优化

    使用 `LIKE` 操作符时,特别是当通配符 `%` 放在查询字符串的开头时,可能导致全表扫描。 - **示例**: - 可能导致全表扫描: ```sql EXPLAIN SELECT * FROM staffs WHERE NAME LIKE '%July%'; ``` - 较高效的...

    C#实现过滤sql特殊字符的方法集合

    // 如果字符串为空,直接返回空 if (str == String.Empty) return String.Empty; // 替换各种可能的SQL特殊字符 str = str.Replace("'", "‘").Replace(";", ";").Replace(",", ",").Replace("?", "?").Replace...

Global site tag (gtag.js) - Google Analytics