SQL сопоставления с образцом на первых 5 символах

Я думаю о запросе SQL, который возвращает мне все записи из столбца, первые 5 символов которого совпадают. Есть идеи? Я думаю о записях, где совпадают ЛЮБЫЕ первые 5 символов, а не о конкретных. Например

HelloA
HelloB
ThereC
ThereD
Something

вернет первые четыре записи:

HelloA
HelloB
ThereC
ThereD

РЕДАКТИРОВАТЬ: я использую SQL92, поэтому не могу использовать левую команду!

5 ответов

Решение

Попробуй это:

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

Звучит достаточно просто...

В SQL Server это было бы что-то вроде

where Left(ColumnName,5) = '12345'

Пытаться

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
 )

Вы хотите работать с подходом 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

Вы не указали свою СУБД. Если он поддерживает оконные агрегатные функции, это:

select *
from 
  (
    select
       tab.*, 
       count(*) over (partition by substring(col from 1 for 5) as cnt
    from tab
  ) as dt
where cnt > 1
Другие вопросы по тегам