9

我正在考虑一个 SQL 查询,它返回前 5 个字符匹配的列中的所有条目。有任何想法吗?我正在考虑任何前 5 个字符匹配的条目,而不是特定的条目。例如

HelloA
HelloB
ThereC
ThereD
Something

将返回前四个条目:

HelloA
HelloB
ThereC
ThereD

编辑:我使用的是 SQL92,所以不能使用左命令!

4

5 回答 5

12

尝试这个 :

SELECT *
FROM YourTable
WHERE LEFT(stringColumn, 5) IN (
    SELECT LEFT(stringColumn, 5)
    FROM YOURTABLE
    GROUP BY LEFT(stringColumn, 5)
    HAVING COUNT(*) > 1
    )

SQLFIDDLE DEMO

这将选择前 5 个字符,按它们分组并仅返回多次出现的字符。

或使用子字符串:

SELECT * FROM YourTable 
WHERE substring(stringColumn,1,5) IN (
  SELECT substring(stringColumn,1,5)
  FROM YOURTABLE
GROUP BY substring(stringColumn,1,5)
HAVING COUNT(*) > 1)
;

SQLFIDDLE DEMO

于 2013-11-06T19:26:01.850 回答
7

听起来很容易...

在 SQL Server 中,这将类似于

where Left(ColumnName,5) = '12345'
于 2013-11-06T19:26:06.740 回答
0

您没有指定您的 DBMS。如果它支持窗口聚合函数,它是:

select *
from 
  (
    select
       tab.*, 
       count(*) over (partition by substring(col from 1 for 5) as cnt
    from tab
  ) as dt
where cnt > 1
于 2013-11-06T19:48:46.593 回答
0

尝试

Select *
From tbl t1
Where exists (
    Select 1
    From tbl t2
    Where left(t1.str, 5) = left(t2.str)
    Group by left(t2.str, 5)
    Having count(1) > 1
 )
于 2013-11-06T19:41:50.517 回答
0

您想使用CTE方法。

像这样的东西:

with CountriesCTE(Id, Name)
as (
select Id, Name from Countries
)
select distinct Countries.Name
from CountriesCTE, Countries
where left(CountriesCTE.Name,5) = left(Countries.Name,5) and CountriesCTE.Id <> Countries.Id
于 2013-11-06T19:50:13.600 回答