Sql server 如何在雪花中搜索彼此非常接近的单词?

Sql server 如何在雪花中搜索彼此非常接近的单词?,sql-server,snowflake-cloud-data-platform,Sql Server,Snowflake Cloud Data Platform,假设我的表有一个字符串列,即VARCHAR(),每个字符串都是一个句子。我想在本专栏中搜索一些句子,这些句子中的某个单词与另一个单词非常接近 例如,如果我想在SQL Server中搜索两个术语“Smith”中包含“John”的句子,我会这样做 SELECT row_id FROM my_table WHERE CONTAINS(sentence_column, 'NEAR((John, Smith), 2)') 这是如何转化为雪花的 您可以编写一个UDF来近似该语法。这并不是为了重现SQL

假设我的表有一个字符串列,即
VARCHAR()
,每个字符串都是一个句子。我想在本专栏中搜索一些句子,这些句子中的某个单词与另一个单词非常接近

例如,如果我想在SQL Server中搜索两个术语“Smith”中包含“John”的句子,我会这样做

SELECT row_id
FROM my_table
WHERE CONTAINS(sentence_column, 'NEAR((John, Smith), 2)') 

这是如何转化为雪花的

您可以编写一个UDF来近似该语法。这并不是为了重现SQL server的近似语法,而是展示了如何实现。它只处理用于分词的空格,但可以修改以支持其他分词。它不区分大小写。如果希望它区分大小写,可以删除toUpperCase()方法

在附近创建或替换函数(STR字符串、STR1字符串、STR2字符串、距离浮点)
返回布尔值
语言javascript
像
$$
var firstWord=-1;
var secondWord=-1;
var words=STR.split(“”);
for(var i=0;i返回(第一个单词>=0)和(第二个单词>=0)和(secondWord-firstWord您可以编写一个UDF来近似该语法。这不是为了复制SQL server的近似语法,而是为了说明如何实现。它只处理分词空格,但可以修改以支持其他分词。它不区分大小写。如果您希望它区分大小写,可以删除toUpperCase()方法

在附近创建或替换函数(STR字符串、STR1字符串、STR2字符串、距离浮点)
返回布尔值
语言javascript
像
$$
var firstWord=-1;
var secondWord=-1;
var words=STR.split(“”);
for(var i=0;ireturn(firstWord>=0)和&(secondWord>=0)和&(secondWord-firstWord这对我来说很有用。谢谢!我对它做了一些修改,允许搜索一个单词包含另一个非常接近的单词:第11行`if(单词[I].toUpperCase().includes(STR2.toUpperCase()))secondWord=i;``@juju88您能把这个问题标记为解决方案吗?如果有机会,它应该是这个答案左边的一个按钮。谢谢!这对我有用。谢谢!我对它做了一点修改,允许搜索一个单词包含的另一个单词非常接近:第11行``如果(单词[i].toUpperCase().includes(STR2.toUpperCase()))secondWord=i;``@juju88你能把这个问题标记为解决方案吗,当你有机会的时候,它应该是这个答案左边的一个按钮。谢谢!
create or replace function NEAR(STR string, STR1 string, STR2 string, DISTANCE float)
returns boolean
language javascript
as
$$
    var firstWord = -1;
    var secondWord = -1;
    var words = STR.split(" ");
    for (var i=0; i < words.length; i++){
        if (words[i].toUpperCase() === STR1.toUpperCase()) firstWord = i;
        if (words[i].toUpperCase() === STR2.toUpperCase()) secondWord = i;
    }
    return (firstWord >= 0) && (secondWord >= 0) && (secondWord - firstWord <= DISTANCE)
$$;

select near('John Jacob Smith', 'John', 'Smith', 2);  --True
select near('John Jacob Williams Smith', 'John', 'Smith', 2);  --False