当前位置:首页 » 编程语言 » sql相似度查询
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql相似度查询

发布时间: 2023-02-24 03:24:13

sql 怎么查询与条件80%相似的数据

SQL> create table ttb(name varchar2(10));

Table created.

SQL> insert into ttb values('asdfjkl');

1 row created.

SQL> insert into ttb values('asdkb');

1 row created.

SQL> insert into ttb values('asd323s');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from ttb;

NAME
------------------------------
asdfjkl
asdkb
asd323s

SQL> select wm_concat(name) from ttb;

WM_CONCAT(NAME)

asdfjkl,asdkb,asd323s

SQL> with t as (select to_char(wm_concat(name)) a from ttb) select substr(y.a,1,x.lvl-1) returnvalue from (select distinct(lvl) lvl from (select rn,first_value(lvl) over(order by lvl) lvl,cnt from (select rn,lvl,count(distinct(str)) cnt from (select rn,level lvl,substr(str,1,level) as str from (select rn,str from (select rn,regexp_substr(a,'[^,]+',1,level,'i') as str from (select rownum rn,a from t) connect by level<=length(a)-length(regexp_replace(a,',',''))+1)) connect by level<=length(str)) group by rn,lvl order by lvl asc) where cnt<>1)) x left join t y on 1=1;

RETURNVALUE

② sql怎么查询一列数据的相似度

with t as (select 'xspasdfdfsdfz,xpaysdfsdss,xparsdfd' a from al)
selectsubstr(y.a,1,x.lvl-1) returnvalue from (selectdistinct(lvl) lvl from (select rn,first_value(lvl) over(orderby lvl) lvl,cnt from (select rn,lvl,count(distinct(str)) cnt from (select rn,level lvl,substr(str,1,level) as str from (select rn,str from (select rn,regexp_substr(a,'[^,]+',1,level,'i') as str from (selectrownum rn,a from t) connectby
level<=length(a)-length(regexp_replace(a,',',''))+1)) connectbylevel<=length(str)) groupby rn,lvl orderby lvl asc) where cnt<>1)) x leftjoin t y on1=1;

RETURNVALUE
--------------------------------------------------------------------------------
x

SQL> with t as (select 'xxxxasdfdfsdfz,xxxxxysdfsdss,xxxxxxxxsdfd' a from al)
select substr(y.a,1,x.lvl-1) returnvalue from (select distinct(lvl) lvl from (select rn,first_value(lvl) over(order by lvl) lvl,cnt from (select rn,lvl,count(distinct(str)) cnt from (select rn,level lvl,substr(str,1,level) as str from (select rn,str from (select rn,regexp_substr(a,'[^,]+',1,level,'i') as str from (select rownum rn,a from t) connect by
3 level<=length(a)-length(regexp_replace(a,',',''))+1)) connect by level<=length(str)) group by rn,lvl order by lvl asc) where cnt<>1)) x left join t y on 1=1
4 ;

RETURNVALUE
--------------------------------------------------------------------------------
xxxx

这个例子 'xxxxasdfdfsdfz,xxxxxysdfsdss,xxxxxxxxsdfd' 是把这些放在一行里面 如果是一列数据 可以把列转成行
SQL> select * from tt;

ID NAME
---------- ------------------------------
1 aab
1 aac
2 ddca
2 ddcp
2 ddco

SQL> select id,wm_concat(name) newstr from tt group by id;

ID NEWSTR
---------- --------------------
1 aab,aac
2 ddca,ddco,ddcp

这样把最上面的SQL写成函数,直接用函数来处理各分组里面相似度

③ sql 查询一个表内某一字段相似数据

可以用like模糊查询:

select*fromAwherechecklike'我是中国人我来自%'

④ SQL里面如何计算两列地址(中文)的相似度

相似度公式:Kq*q/(Kq*q+Kr*r+Ks*s)(Kq>0,Kr>=0,Ka>=0)设q是字符串1和字符串2中都存在的单词的总数,s是字符串1中存在,字符串2中不存在的单词总数,r是字符串2中存在,字符串1中不存在的单词总数,t是字符串1和字符串2中都不存在的单词总数。

createFUNCTION[dbo].[F_strcompare](@str1VARCHAR(8000),
@str2VARCHAR(8000))
RETURNSVARCHAR(10)
AS
BEGIN
DECLARE@iINT,
@jINT,
@kINT,
@retVARCHAR(10)

SELECT@i=MAX(strlen),
@j=MIN(strlen),
@k=0
FROM(SELECTstrlen=Len(@str1)
UNION
SELECTstrlen=Len(@str2))t

IF(@j=0)
RETURN'0'

WHILE@j>0
BEGIN
IFSubstring(@str1,@j,1)=Substring(@str2,@j,1)
SET@k=@k+1

SET@j=@j-1
END

SET@ret=Rtrim(CAST(@k*100.0/@iASNUMERIC(3,0)))

RETURN@ret
END

⑤ mysql相似度查询语句

如果仅仅通过SQL语句就要达到这个效果很难了。

我的思路是将查询的关键字,先拆分成一个一个的单个字符。
比如 “我在中国” 。

SQL语句就变成
select 字段名 from 表名 where 字段名 like '%我%' or 字段 like '%在%' or 字段 like '%中%' or 字段 like '%国%' .

不过,在mysql中怎样将这个的一个字符串切割成单个字符,并形成这样一个sql语句呢,本人比较笨,不晓得咋弄。或许存储过程能够实现。

我也看了下mysql的字符串的处理函数。没有太大头绪。。
这里是地址,也许对你有用。
http://apps.hi..com/share/detail/7841605

然后呢。我还是建议你先在程序上将关键字拆分。再代入sql中进行查询。

⑥ sql如何高效的比对两个字符串的相似度

如表格A中字段a1有一条字符串记录Rec1内容为 “我的家在哪里?”;然后要从B表中找出一条字符串记录Rec2内容与Rec1最相似的,如:“我的家在浙江?” select A.a1, max(DIFFERENCE(A.a1,B.相应字段)) from A cross join B group by A.a1

⑦ MYSQL 查询数据 的相似度

封装一个存储过程,把ahuudf拆成一个个字节,设定一个权值,当作匹配度。通过 _ * 作为来构造like条件。将结果集存储,然后将最后的结果集进行适当的处理。比如去重之类的。个人想法。没试过。还凭楼主自己试试

⑧ SQL相近记录搜索

可能单独有个类处理排序的(也可能是存储过程)!不一定是在数据库里排的!
因为还有一个相似度验证!这是数字信息处理范畴!

还有一个不是很优化的方法就是你在execute sql前,把你的字符组合装入一个数组!然后while一下这个数组,生成相应的SQL,然后用union连接各部分SQL

不过这样做会有重复记录,而且效率也不高!需要你再手工处理!还不如第一种方法好!先把记录检出来,然后通过单独的一个线程处理排序

⑨ sql 匹配相似记录

不知道你的相似度判断的规则是什么,通过数据库实现的话,可以考虑定义一个相似度比较函数,然后在update时调用并判断,下面是MSSQL的思路,不过需要把相似度判断的函数写完整。
其他数据库应该也可以用相同思路来做吧。
FUNCTION fn_GetSimilar
(
@strA As Varchar(255), --传入的待比较的字符
@StrB As Varchar(255 --期望字符
)
RETURNS int
AS
BEGIN
DECLARE @Result int;
if @strA= @StrB
begin
set @Result=100
end
----
--相似度判断条件及判断方法赋值
----
RETURN @Result
END

如果函数测试没问题,就可以调用下面的方法来修改了
update 不规则名称表 set StdMedName=b.CommonName from 标准名称表 b
where dbo.fn_GetSimilar( 不规则名称表.IrrMedName,b.CommonName)>相似度的值

⑩ sql怎么查询一列数据的相似度

SQL> create table ttb(name varchar2(10));

Table created.

SQL> insert into ttb values('asdfjkl');

1 row created.

SQL> insert into ttb values('asdkb');

1 row created.

SQL> insert into ttb values('asd323s');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from ttb;

NAME
------------------------------
asdfjkl
asdkb
asd323s

SQL> select wm_concat(name) from ttb;

WM_CONCAT(NAME)
--------------------------------------------------------------------------------
asdfjkl,asdkb,asd323s

SQL> with t as (select to_char(wm_concat(name)) a from ttb) select substr(y.a,1,x.lvl-1) returnvalue from (select distinct(lvl) lvl from (select rn,first_value(lvl) over(order by lvl) lvl,cnt from (select rn,lvl,count(distinct(str)) cnt from (select rn,level lvl,substr(str,1,level) as str from (select rn,str from (select rn,regexp_substr(a,'[^,]+',1,level,'i') as str from (select rownum rn,a from t) connect by level<=length(a)-length(regexp_replace(a,',',''))+1)) connect by level<=length(str)) group by rn,lvl order by lvl asc) where cnt<>1)) x left join t y on 1=1;

RETURNVALUE
--------------------------------------------------------------------------------
asd