【问题标题】:How to find rows in SQL that start with the same string (similar rows)?如何在 SQL 中查找以相同字符串(相似行)开头的行?
【发布时间】:2011-03-18 10:08:18
【问题描述】:

我有一个主键如下所示的表:

FIRSTKEY~ABC

SECONDKEY~DEF

FIRSTKEY~DEF

我想编写一个 SELECT 语句,该语句去除波浪号后面的段,并在波浪号后段消失后返回所有重复的行。也就是说,

选择 ...

给我:

FIRSTKEY~ABC

FIRSTKEY~DEF

作为“重复”。

我已经有了用 SUBSTRING 去掉结尾段的位:

SELECT SUBSTRING(COLUMN, 0, CHARINDEX('~', COLUMN)) 从表中

这是在 SQL Server 上。

【问题讨论】:

  • 那么在 WHERE 子句中使用该位来检查两个位是否相等,然后返回值?

标签: sql-server select duplicates substring


【解决方案1】:

试一试

SELECT SUBSTRING(COLUMN, 0, CHARINDEX('~', COLUMN)), COUNT(*) FROM TABLE 
GROUP BY SUBSTRING(COLUMN, 0, CHARINDEX('~', COLUMN))
HAVING COUNT(*) > 1

【讨论】:

  • 这行得通,但我喜欢给我原始行的答案。
【解决方案2】:

给出的第一个解决方案将识别键前缀;稍微扩展一下以获取以这些键开头的表行:

SELECT * 
FROM TABLE
WHERE SUBSTRING(COLUMN, 0, CHARINDEX('~', COLUMN)) IN
(
    SELECT SUBSTRING(COLUMN, 0, CHARINDEX('~', COLUMN)) FROM TABLE 
    GROUP BY SUBSTRING(COLUMN, 0, CHARINDEX('~', COLUMN))
    HAVING COUNT(*) > 1
)

或者,您可以在包含前缀的临时表和原始表之间使用连接 - 如果前缀的数量变得非常大,使用“where in”可能会变得非常昂贵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    • 2017-12-20
    • 2011-10-11
    相关资源
    最近更新 更多