2016-04-09 17 views
4

同じ名字のすべてのバンドメンバーの名前を一覧表示するにはどうすればよいですか?列内の2番目の値を見つける方法

列には、私たちはinstrsubstrを使用する必要があります知っているこの

band_NAME 
------------------- 
Carla Thomas 
Stephen E. Rice 
Cynthia P. Tree 
Richard Anthony Paul 
Ann Frances Smith 
Lorace Black 
Timothy Adam Paul 

のような値を持っています。私はちょうど私達が位置を決める方法を得ない。

私は、基本フォーマットは

SELECT band_NAME 
FROM TABLE 
where substr(band_name, ?, instr() IN 
    (select substr(band_name, ?, instr()-1) 
    from table 
    group by SUBSTR(band_NAME , ?, INSTR()-1) 
    HAVING COUNT(*) > 1); 

ようになるだろう。しかし疑問符にとinstr内部で何が起こっている知っていますか?

これについて助けていただければ幸いです!

+0

のようなグループにそれらがどのようにこれが動作するようになっているだろうか? 'Jerry Lee Lewis'ではファーストネームは 'Jerry Lee'、姓は 'Lewis'なので、最後の空白で最初と姓を分けます。 'GabrielGarcíaMärquez'では、最初の名前は「Gabriel」で、姓は「GarcíaMárquez」です。つまり、最初の空白で分割します。また、 'Juan LuisGarcíaPerales'のような名前があり、最初と最後の空白の区別がつかない。その後、姓が最初に来る中国の名前について考える。 –

+0

まあまあ、私はそれを分割する方法を理解していません。上記の名前の中には初期のミドルネームがあるものもありますが、それは期間の後に分割することができますが、3つの名前を持つ他の人は、どうやってやるのか分かりません。姓のマッチを見つけて表示する方法を見つけ出す必要があります – Bob

+0

私が言っていることは、あなたがファーストネームであることと、完全なネームだけから姓であるものを引き出すことができないということです。より多くの情報が必要です。多分最初と姓の辞書。 (そして、それでもなお、「ポール」は名字と姓の両方になります)。たぶんあなたは妥協しても問題ありません。しかし、あなたがうまくいくというルールを定義するのはあなた次第です。 –

答えて

0

私は、姓と名の間の区切り文字が単一のスペースであると仮定しています。文字列内のスペースの数は、姓の一部です。したがって、おそらく最初のスペース文字を検索する必要があります。

部分文字列の最初の出現位置をinstr(str, substr)に戻します。

次に、substring(str, pos)を使用して、指定された位置から始まる部分文字列(instr関数によるフィード)を返します。

SELECT substring(band_name, instr(band_name, ' ')) 
FROM yourtable 
+0

質問を投稿する前にこの試行を試しましたが、うまくいきません:( – Bob

+1

@Bob: –

+0

申し訳ありませんが、私はこれで完全な初心者です。上記のコードを試したとき、それは "無効"と言いました.. – Bob

0

これを試してください:あなたの擬似コードMySQLのよう

SELECT t1.band_NAME 
FROM TABLE t1 LEFT JOIN TABLE t2 
ON SUBSTRING_INDEX(t1.band_name, ' ', - 1) = SUBSTRING_INDEX(t2.band_name, ' ', - 1) 
WHERE t1.band_name <> t2.band_name 

そして、この:

SELECT band_NAME FROM TABLE 
Where FIND_IN_SET (SUBSTRING_INDEX(band_name, ' ', -1), 
(Select SUBSTRING_INDEX(band_name, ' ', -1) bn 
From TABLE Group by bn 
having Count(bn) > 1 
) 
) 

SQL Serverを

SELECT band_NAME FROM TABLE 
Where 
SUBSTRING(band_NAME, CHARINDEX(' ', band_NAME) + 1, LEN(band_NAME)) AS [Last Name] 
IN 
(Select SUBSTRING(band_NAME, CHARINDEX(' ', band_NAME) + 1, LEN(band_NAME)) AS [Last Name] 
From TABLE Group by [Last Name] -- or SUBSTRING(band_NAME, CHARINDEX(' ', band_NAME) + 1, LEN(band_NAME)) AS [Last Name] 
having Count(*) > 1 
) 
) 

はまた、私はあなたがこの

with cte as 
(
select band_name, ROW_NUMBER() over(partition by SUBSTRING(band_name,CHARINDEX(' ',band_name),LEN(band_name)) order by band_name) as cnt, 
     SUBSTRING(band_name,CHARINDEX(' ',band_name),LEN(band_name)) as lastname 
from your_table 
) 
select band_name 
from cte 
where lastname in (select lastname from cte where cnt > 1) 
+0

それは働いていません:(予期しないSQLコマンドの終了を言います – Bob

+0

私はそれを試してみましたが、それはうまく働いていました。私は、カッコが正しく閉じられていることを確認できますか?あなたは実際のテーブル名で2つの場所で 'TABLE'を変更できますか?@Bob – wajeeh

+0

それは "SQLの予期しない終了"と言います。それは "部分文字列インデックス"を認識しないので、別の括弧を追加した後にsubstrに置き換えました。次に、 "bn"は "無効な演算子 - 存在しません"と表示されます。 – Bob

0

に利益をもたらすことができると考えて、

最良の解決策は、別の列にあなたのスキーマとストア姓を変更することです。あなたはこのような姓を得ることができた平均時間で

SELECT 
      [band_NAME], 
      CASE WHEN CHARINDEX(' ', [band_NAME]) > 0 
       THEN 
        RIGHT([band_NAME], CHARINDEX(' ', REVERSE([band_NAME]))) 
       ELSE 
        [band_NAME] 
      END [LastName] 
    FROM 
      [TABLE] 

あなたは、この

SELECT 
      [LastName], 
      COUNT(*) 
    FROM 
     (
      SELECT 
        [band_NAME], 
        CASE WHEN CHARINDEX(' ', [band_NAME]) > 0 
         THEN 
          RIGHT([band_NAME], CHARINDEX(' ', REVERSE([band_NAME]))) 
         ELSE 
          [band_NAME] 
        END [LastName] 
       FROM 
        [TABLE] 
     ) [TABLEWithLastName] 
    GROUP BY 
      [LastName]; 
関連する問題