我遇到了有关字符串匹配的问题。 我想要的是匹配表中的名称与包含相同名称的另一个名称+后面的端口名称。
eg.
TABLE:
name
1 abc
2 abc.8002
3 bcd
4 qwe
5 qwe.8002
Where the result would be another table of the form:
TABLE:
name
1 abc
2 abc.8002
3 qwe
4 qwe.8002
我已经在java代码中描述了这个问题,如果你能帮我翻译,那将非常感激。
List temp = new ArrayList<String>();
for (String name1 : Names) {
for (String name2 : Names) {
if (name1 != name2
&& name2.contains(name1.substring(0,2))) {
temp.add(name1);
}
}
}
答案 0 :(得分:1)
自我加入。使用LIKE
匹配名称。
select t1.name
from tablename t1
join tablename t2
on (t1.name like t2.name || '%' or t2.name like t1.name || '%')
and t1.name <> t2.name
||
是ANSI SQL串联。有些产品会改为concat()
或+
。
To&#34;选择前三个字母部分重复的字母&#34;您可以使用SUBSTRING()
代替LIKE
:
select t1.name
from tablename t1
join tablename t2
on substring(t1.name from 1 for 3) = substring(t2.name from 1 for 3)
and t1.name <> t2.name
ANSI SQL语法也在这里。有些dbms有SUBSTR(t1.name, 1, 3)
或LEFT(t1.name, 3)
或类似。
答案 1 :(得分:0)
这样的事情应该有效。 与JOINs一起玩,thogh。
SELECT T.NAME
FROM TABLE T
INNER JOIN (SELECT NAME
FROM (
SELECT SUBSTRING(NAME,1,3) AS NAME FROM TABLE
)
GROUP BY NAME
HAVING COUNT(NAME) > 1) C
WHERE T.NAME like C.NAME || '%'
答案 2 :(得分:0)
整理了一下:
select t1.name
from TABLENAME t
inner join TABLENAME t1 on (substring(t1.name,1,3) = t.name and t1.name regexp '[a-z]{3}\.[0-9]{4}')
or (substring(t.name,1,3) = t1.name and t.name regexp '[a-z]{3}\.[0-9]{4}')