SQL匹配字符串

时间:2017-03-02 09:56:56

标签: java sql string translation

我遇到了有关字符串匹配的问题。 我想要的是匹配表中的名称与包含相同名称的另一个名称+后面的端口名称。

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);
        }
    }
}

3 个答案:

答案 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}')