前5个字符上的模式匹配SQL

前5个字符上的模式匹配SQL,sql,pattern-matching,ansi-sql-92,Sql,Pattern Matching,Ansi Sql 92,我正在考虑一个SQL查询,它返回一列中前5个字符匹配的所有条目。有什么想法吗? 我考虑的是任何前5个字符匹配的条目,而不是特定的条目。例如 HelloA HelloB ThereC ThereD Something 将返回前四个条目: HelloA HelloB ThereC ThereD 编辑:我正在使用SQL92,因此无法使用left命令 试试这个: SELECT * FROM YourTable WHERE LEFT(stringColumn, 5) IN ( SELECT L

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

HelloA
HelloB
ThereC
ThereD
Something
将返回前四个条目:

HelloA
HelloB
ThereC
ThereD
编辑:我正在使用SQL92,因此无法使用left命令

试试这个:

SELECT *
FROM YourTable
WHERE LEFT(stringColumn, 5) IN (
    SELECT LEFT(stringColumn, 5)
    FROM YOURTABLE
    GROUP BY LEFT(stringColumn, 5)
    HAVING COUNT(*) > 1
    )
这将选择前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)
;
听起来很简单

在SQL Server中,这将是与

where Left(ColumnName,5) = '12345'
试一试


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

select *
from 
  (
    select
       tab.*, 
       count(*) over (partition by substring(col from 1 for 5) as cnt
    from tab
  ) as dt
where cnt > 1
你想用一种方法工作

大概是这样的:

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

请看我编辑的问题。我指的是任何前5个字符,不是特定的字符,所以可能不能使用like@MJP。更新了我的答案。看看这是不是你想要的。通常,在问题中加上您正在使用的sql风格的标签是一个好主意。完成!我想在我的DBMS版本中,我不能使用left命令!使用左命令的子字符串。。。
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