- 締切済み
SQLServerで文字列の末尾からある位置で取出
SQLServerで文字列の末尾からある位置で取出 SQLServer2012で selectで文字列の末尾から(右から)ある文字の位置までを取り出したいのですが どのようなSQLにすればよいのでしょうか。 やりたいことは、 データとしては 部署名△チーム名△UP△0000001 部署名△チーム名△DW△0000002 部署名△チーム名△w00001 部署名△チーム名△000003 : : 部署名△チーム名△UP△100001 部署名△チーム名△DW△100002 ※△=半角スペース の様なデータから獲たいデータは、 UP△000001 DW△000002 w00001 000003 ; UP△100001 DW△100002 を取り出したいのです お願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- innoya
- ベストアンサー率71% (10/14)
これは正確なルールがない限り難しそうですね。 役に立てずすみません。
- innoya
- ベストアンサー率71% (10/14)
こんにちは。 データには必ず「OOOチーム」の文字が入っていて その後の文字を抽出したいですか?? それなら下記のSQLを確認してください。 どうでしょうか? CREATE TABLE dbo.TempData ( Data1 varchar(100) ) INSERT INTO dbo.TempData SELECT 'A 部 A1 チーム UP 000001' UNION ALL SELECT 'A 部 A2 チーム 000002' UNION ALL SELECT 'A 部 A3 チーム DW 000003' UNION ALL SELECT 'B B 部 BB1 チーム UP 000004' UNION ALL SELECT 'B B 部 BB2 チーム 000005' UNION ALL SELECT 'B B 部 BB3 チーム UP 000006' UNION ALL SELECT 'C CCC 部 CCC1 チーム tokyo 000007' UNION ALL SELECT 'C CCC 部 CCC2 チーム tokyo' UNION ALL SELECT 'C CCC 部 CCC3 チーム UP 000009' UNION ALL SELECT 'D DD 部 DD1 チーム 000010' UNION ALL SELECT 'D DD 部 DD2 チーム DW 000011' SELECT SUBSTRING(Data1, CHARINDEX('チーム',Data1)+4, LEN(Data1)-CHARINDEX('チーム',Data1)+4) FROM dbo.TempData --実行結果 UP 000001 000002 DW 000003 UP 000004 000005 UP 000006 tokyo 000007 tokyo UP 000009 000010 DW 000011
お礼
ありがとうございます。 >データには必ず「OOOチーム」の文字が入っていて そうとも限らないです。
- innoya
- ベストアンサー率71% (10/14)
こんにちは。 修正しました。 下記のSQLを確認してください。 どうでしょうか? CREATE TABLE dbo.TempData ( Data1 varchar(100) ) INSERT INTO dbo.TempData SELECT 'A 部 A1 チーム UP 000001' UNION ALL SELECT 'A 部 A2 チーム 000002' UNION ALL SELECT 'A 部 A3 チーム DW 000003' UNION ALL SELECT 'B B 部 BB1 チーム UP 000004' UNION ALL SELECT 'B B 部 BB2 チーム 000005' UNION ALL SELECT 'B B 部 BB3 チーム UP 000006' UNION ALL SELECT 'C CCC 部 CCC1 チーム 000007' UNION ALL SELECT 'C CCC 部 CCC2 チーム 000008' UNION ALL SELECT 'C CCC 部 CCC3 チーム UP 000009' UNION ALL SELECT 'D DD 部 DD1 チーム 000010' UNION ALL SELECT 'D DD 部 DD2 チーム DW 000011' SELECT CASE WHEN SUBSTRING(REVERSE(Data1), CHARINDEX(' ',REVERSE(Data1))+1, 2) IN ('PU', 'WD') THEN RIGHT(Data1, CHARINDEX(' ',REVERSE(Data1))+2) ELSE RIGHT(Data1, CHARINDEX(' ',REVERSE(Data1))-1) END FROM dbo.TempData 実行結果 UP 000001 000002 DW 000003 UP 000004 000005 UP 000006 000007 000008 UP 000009 000010 DW 000011
お礼
ありがとうござます。 一応、動きました。 私の質問の仕方が悪いのか、よくデータを確認せずに説明 をしているのがいけないのか データが規則正しくないものが出てきて上手く動きません。 例えば A & B部 T1 & T2 お助けチーム UP 000001 A & B部 T1 & T2 お助けチーム DOWN 000002 A & B部 T1 & T2 お助けチーム Tokyo A & B部 T1 & T2 お助けチーム Tokyo Japan A & B部 T1 & T2 お助けチーム UP Tokyo A & B部 T1 & T2 お助けチーム DOWN Tokyo Japan などがでてきました。 結果としては UP 000001 DOWN 000002 Tokyo Tokyo Japan UP Tokyo DOWN Tokyo Japan と期待しています。 何だか、無理なような気がしてきました。
- innoya
- ベストアンサー率71% (10/14)
こんにちは。 再度質問をアップしてくださったのですね。 下記の質問でここまで回答ができずすみません。 それでは、これはいかがでしょうか! これでご満足の回答になりましたでしょうか~ substringとcharindexを使いました。 少し複雑に見えますが、 一つ一つ並べてみればそんなに複雑ではないと思います。 もし分からないことがありましたら、また質問してください。 よろしくお願い致します。 CREATE TABLE dbo.TempData ( Data1 varchar(100) ) INSERT INTO dbo.TempData SELECT 'A部 A1チーム UP 000001' UNION ALL SELECT 'A部 A2チーム 000002' UNION ALL SELECT 'A部 A3チーム DOWN 000003' UNION ALL SELECT 'BB部 BB1チーム UP 000004' UNION ALL SELECT 'BB部 BB2チーム 000005' UNION ALL SELECT 'BB部 BB3チーム UP 000006' UNION ALL SELECT 'CCCC部 CCC1チーム 000007' UNION ALL SELECT 'CCCC部 CCC2チーム 000008' UNION ALL SELECT 'CCCC部 CCC3チーム UP 000009' UNION ALL SELECT 'DDD部 DD1チーム 000010' UNION ALL SELECT 'DDD部 DD2チーム DOWN 000011' SELECT SUBSTRING(SUBSTRING(Data1, CHARINDEX(' ', Data1)+1, LEN(Data1)-CHARINDEX(' ', Data1)+1), CHARINDEX(' ', SUBSTRING(Data1, CHARINDEX(' ', Data1)+1, LEN(Data1)-CHARINDEX(' ', Data1)+1) )+1, LEN(Data1)-CHARINDEX(' ', SUBSTRING(Data1, CHARINDEX(' ', Data1)+1, LEN(Data1)-CHARINDEX(' ', Data1)+1) )+1) FROM dbo.TempData 実行結果 UP 000001 000002 DOWN 000003 UP 000004 000005 UP 000006 000007 000008 UP 000009 000010 DOWN 000011
お礼
ありがとうございます。 一応、動きました。 ただ、データが規則正しくないものが出てきて上手く動きません。 部署名とかチーム名の間に半角スペースが複数存在するものがあり、チーム名の一部を表示します。 例えば A & B部 T1 & T2 お助けチーム UP 000001 A & B部 T1 & T2 お助けチーム DW 000002 A & B部 T1 & T2 お助けチーム 000003 などです。
お礼
そうですよね。 やはり、正確なルールがなければ無理ですよね。 丁寧、親切に対応していただきありがとう ござました。