我需要测试一个字符串(文件名及其完整路径)是否包含MSSQL中的另一个字符串。
我的脚本需要检查我们要提交的文件是否存在于特定列(预挂钩脚本)下的数据库中。
我无法真正更改列的数据定义,但我们当前正在使用文本TEXT
,文件由新行字符分隔。我尝试使用TSQL函数CONTAINS
,但整体性能并不是很好。
在PHP数组中加载所有数据并在本地进行比较会更好吗?
我不太确定这里最好的方法是什么。
更新:数据库中大约有194 530行。
答案 0 :(得分:1)
如何使用LIKE
运算符?你可以做这样的事情
SELECT * FROM TABLE WHERE COLUMN LIKE '%' + @FilePath +'%'
如果这不符合您的需求,那么,我同意以编程方式执行此操作可能会更好。问题是SQL使用基于集合的逻辑,所以当你开始做更多程序(函数)的事情时,它就会崩溃。显然,运行测试,但以编程方式,您应该能够更快地执行此操作。你可以使用正则表达式或包含或在php中最好的东西
答案 1 :(得分:1)
我认为这会更快:
SELECT TOP 1 columnname FROM tablename WHERE COLUMN LIKE '%' + @FilePath +'%'
答案 2 :(得分:1)
在搜索字符串时要记住的主要事项是,您要限制要搜索的字符串的长度。现在,你有多个路径+文件名值隐藏在一个行 - 列对中 - 正如我上面提到的,这很难规范化(并且是你在查找时遇到麻烦的部分原因)。
鉴于您无法真正更改您遇到问题的表的架构,更好的替代方案可能是创建一个结构来处理描述某行中存储的文件的元数据。
例如,一个选项可能是创建一个包含filename
- rowID
对的表,其中原始表的每一行都链接到{{1}中已解析的文件名该行的列。这使您可以选择通过首先对较短的字符串(TEXT
)进行查找来限制搜索,然后使用该约束来帮助搜索较少数量的行以满足路径+文件名组合并实现独特的结果。
如果您有大量具有相同名称的文件,则另一个选项可能是使用原始表中的filename
和使用{{来自该行的每个路径+文件名的哈希值来实现哈希索引1}}或者你可以使用的任何散列函数。
使用像这样的“索引”表会增加开销:您必须在原始表更新时维护元数据,但这也意味着您需要提前完成繁重的工作,并在将来对数据进行查询更快。