sql查询以基于子字符串过滤结果

时间:2018-09-23 04:30:39

标签: sql-server tsql sql-server-2012

SQL表具有以下数据,共有3列

Id, 名称和 全名。

| ID | Name | FullName |
| 1  |  a   | a        |
| 2  |  b   | ab       |
| 3  |  c   | abc      |
| 4  |  d   | ad       |
| 5  |  e   | ade      |
| 6  |  i   | i        |
| 7  |  g   | ig       |

例如,在ID = 1和ID的行中,“全名”列的值分别为“ a”和“ ab”。此数据是第3行(id = 3)全名列数据'abc'的子字符串。

如何排除Id = 1和Id = 2行,因为'全名'列数据是Id = 3行中FullName列值'abc'的子字符串。

所需的输出

| ID | Name | FullName |
| 3  |  c   | abc      |
| 5  |  e   | ade      |
| 7  |  g   | ig       |

2 个答案:

答案 0 :(得分:0)

这是一个似乎有效的查询。我们可以将匹配的全名用短语表示为没有该全名的父母。

SELECT t1.*
FROM yourTable t1
WHERE
    NOT EXISTS (SELECT 1 FROM yourTable t2
                WHERE t2.FullName LIKE '%' + t1.FullName + '%' AND
                      LEN(t2.FullName) > LEN(t1.FullName));

enter image description here

Demo

答案 1 :(得分:0)

这是一个解决方案:

CREATE TABLE MyTable(
    ID INT,
    Name VARCHAR(45),
    FullName VARCHAR(90)
    );
INSERT INTO MyTable VALUES
(1, 'a', 'a'),
(2, 'b', 'ab'),
(3, 'c', 'abc'),
(4, 'd', 'ad'),
(5, 'e', 'ade'),
(6, 'i', 'i'),
(7, 'g', 'ig');

SELECT *
FROM MyTable 
WHERE ID NOT IN (
                        SELECT DISTINCT T1.ID
                        FROM MyTable T1 INNER JOIN MyTable T2
                        ON T1.ID <> T2.ID
                        AND T2.FullName LIKE '%' + T1.FullName + '%'
                );

结果:

+----+----+------+----------+
|    | ID | Name | FullName |
+----+----+------+----------+
|  1 |  3 | c    | abc      |
|  2 |  5 | e    | ade      |
|  3 |  7 | g    | ig       |
+----+----+------+----------+