like 跟 instr 还有正则都需要匹配具体的条件,而这个不存在指定的条件。想利用sql语句来解决,希望高手给点意见。
建表语句如下:
CREATE TABLE test_col (col_name VARCHAR2(100));
INSERT INTO TEST_COL (COL_NAME) VALUES ('爱特优科新信息技术(北京)有限公司');
INSERT INTO TEST_COL (COL_NAME) VALUES ('爱特优科信息技术(北京)有限公司');
INSERT INTO TEST_COL (COL_NAME) VALUES ('安那络器件(中国)有限公司');
INSERT INTO TEST_COL (COL_NAME) VALUES ('安那络器件(中国)有限公司');
INSERT INTO TEST_COL (COL_NAME) VALUES ('百润时代网络技术(北京)有限公司');
INSERT INTO TEST_COL (COL_NAME) VALUES ('百润时代网络技术有限公司');
INSERT INTO TEST_COL (COL_NAME) VALUES ('北京艾克赛利科技有限公司');
INSERT INTO TEST_COL (COL_NAME) VALUES ('北京艾克赛利微电子技术有限公司');
INSERT INTO TEST_COL (COL_NAME) VALUES ('百度集团');
INSERT INTO TEST_COL (COL_NAME) VALUES ('新浪集团');
我要实现的结果如下:
1 爱特优科新信息技术(北京)有限公司
2 爱特优科信息技术(北京)有限公司
3 安那络器件(中国)有限公司
4 安那络器件(中国)有限公司
5 百润时代网络技术(北京)有限公司
6 百润时代网络技术有限公司
7 北京艾克赛利科技有限公司
8 北京艾克赛利微电子技术有限公司
最好是挨着的,把相近的显示查询出来
10 个解决方案
#1
#2
也想知道
#3
好智能啊~
#4
SQL> select * from test_col;
COL_NAME
--------------------------------------------------------------------------------
1
2
22
33
1
中国
日本
米国
韓国
9 rows selected
SELECT n.col_name
FROM (SELECT m.col_name,
m.keyword,
COUNT(*) OVER(PARTITION BY m.rid, m.keyword) cnt1,
COUNT(*) OVER(PARTITION BY m.keyword) cnt2
FROM (SELECT t1.ROWID rid,
t1.col_name,
SUBSTR(t1.col_name, t2.rn, 1) keyword
FROM test_col t1,
(SELECT ROWNUM rn,
max_len
FROM (SELECT MAX(LENGTH(col_name)) max_len
FROM test_col)
CONNECT BY ROWNUM <= max_len) t2
WHERE LENGTH(t1.col_name) >= rn) m) n
WHERE n.cnt1 <> n.cnt2
COL_NAME
--------------------------------------------------------------------------------
1
1
2
22
22
中国
米国
韓国
8 rows selected
如果表数据大,存储过程效率比SQL要好。
#5
这个想法比较有创意,实用性也比较高!
#6
你的例子里,百润时代网络技术有限公司和百度集团都含有"百",不算相同吗?
#7
相近是一个模糊的值,计算机只能确认精确的值。所以对相近需要给个精确的定义,比如80%以上的字符相同。或者是连续的5个字符相同。然后才能确定算法。
#8
一眼就看出共同点
有限公司
那这个来 %有限公司
就行了
有限公司
那这个来 %有限公司
就行了
#9
百润时代网络技术有限公司和百度集团都含有"百",不算相同吗? 算是相同的。
#10
估计是名称不规范引起了其他问题?
做映射会不会好点,让客户自己维护。
做映射会不会好点,让客户自己维护。
#1
#2
也想知道
#3
好智能啊~
#4
SQL> select * from test_col;
COL_NAME
--------------------------------------------------------------------------------
1
2
22
33
1
中国
日本
米国
韓国
9 rows selected
SELECT n.col_name
FROM (SELECT m.col_name,
m.keyword,
COUNT(*) OVER(PARTITION BY m.rid, m.keyword) cnt1,
COUNT(*) OVER(PARTITION BY m.keyword) cnt2
FROM (SELECT t1.ROWID rid,
t1.col_name,
SUBSTR(t1.col_name, t2.rn, 1) keyword
FROM test_col t1,
(SELECT ROWNUM rn,
max_len
FROM (SELECT MAX(LENGTH(col_name)) max_len
FROM test_col)
CONNECT BY ROWNUM <= max_len) t2
WHERE LENGTH(t1.col_name) >= rn) m) n
WHERE n.cnt1 <> n.cnt2
COL_NAME
--------------------------------------------------------------------------------
1
1
2
22
22
中国
米国
韓国
8 rows selected
如果表数据大,存储过程效率比SQL要好。
#5
这个想法比较有创意,实用性也比较高!
#6
你的例子里,百润时代网络技术有限公司和百度集团都含有"百",不算相同吗?
#7
相近是一个模糊的值,计算机只能确认精确的值。所以对相近需要给个精确的定义,比如80%以上的字符相同。或者是连续的5个字符相同。然后才能确定算法。
#8
一眼就看出共同点
有限公司
那这个来 %有限公司
就行了
有限公司
那这个来 %有限公司
就行了
#9
百润时代网络技术有限公司和百度集团都含有"百",不算相同吗? 算是相同的。
#10
估计是名称不规范引起了其他问题?
做映射会不会好点,让客户自己维护。
做映射会不会好点,让客户自己维护。