web-dev-qa-db-ja.com

最初の5文字のパターンマッチングSQL

最初の5文字が一致する列からすべてのエントリを返すSQLクエリについて考えています。何か案は?特定の文字ではなく、最初の5文字が一致するエントリについて考えています。例えば。

HelloA
HelloB
ThereC
ThereD
Something

最初の4つのエントリを返します。

HelloA
HelloB
ThereC
ThereD

編集:私はSQL92を使用しているので、左のコマンドを使用できません!

8
MJP

これを試して :

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

10
Filipe Silva

簡単そうですね...

SQL Serverでは、これは次のようなものになります。

where Left(ColumnName,5) = '12345'
6
Tim

DBMSを指定していません。 Windowed Aggregate関数をサポートしている場合は、次のようになります。

select *
from 
  (
    select
       tab.*, 
       count(*) over (partition by substring(col from 1 for 5) as cnt
    from tab
  ) as dt
where cnt > 1
0
dnoeth

[〜#〜] 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
0
danielQ

試してみてください

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
 )
0
T I