SQL Master データベースエンジニアとセキュリティエンジニアとLinuxエンジニアのための情報

【SQLドリル001】文字の抽出 REPLACE, SUBSTRING, CHARINDEX

以下のような文字列が入力された列、FullPCNameがある。このFullPCNameからコンピュータ名だけを抽出したい。

FullPCName
————————————–
Tokyo332#server01.sql.jpn.org
Fukuoka00321#server02.sql.jpn.org
server03.sql.jpn.org
Sapporo883#server04.sql.jpn.org
server04.sql.jpn.org
server05
:

server01やserver02のように、ドメイン名を除いたコンピュータ名のみを表示させるにはどのようなSQL文にすれば良いか?

回答例:

PCName
——————————–
server01
server02
server03
server04
server04
server05

 

 

 

MS SQL Serverでの回答案

まず、ドメイン名をブランクで置き換える事から考えましょう。指定した文字列を置換するには、REPLACE関数を使用します。

REPLACE(列名, 置換対象文字列, 置換後の文字列)

SELECT REPLACE(FullPCName, ‘.sql.jpn.org’, ”) as PCName FROM DRILL001;

PCName
———————————————-
Tokyo332#server01
Fukuoka00321#server02
server03
Sapporo883#server04
server04
server05

次はTokyo0332#のような文字列がある場合は、それを取り除く必要があります。そのためには、まず、#以前の文字列を抽出します。抽出するためには、先頭から#までの文字数を取得して、SUBSTRING関数で文字列を取得します。

SELECT CHARINDEX(‘#’, REPLACE(FullPCName, ‘.sql.jpn.org’, ”)) AS ‘文字数’ from DRILL001;

文字数
—————————–
9
13
0
11
0
0

SELECT SUBSTRING(REPLACE(FullPCName, ‘.sql.jpn.org’, ”), 0, CHARINDEX(‘#’, REPLACE(FullPCName, ‘.sql.jpn.org’, ”))+1) AS ‘取り除く文字列’ from DRILL001;

取り除く文字列
——————————
Tokyo332#
Fukuoka00321#
<NULL>
Sapporo883#
<NULL>
<NULL>

最後にREPLACE関数で取り除く文字列をNULLで置き換えます。

SELECT REPLACE(REPLACE(FullPCName, ‘.sql.jpn.org’, ”), SUBSTRING(REPLACE(FullPCName, ‘.sql.jpn.org’, ”), 0, CHARINDEX(‘#’, REPLACE(FullPCName, ‘.sql.jpn.org’, ”))+1), ”) AS ‘PCName’?from DRILL001;

PCName
——————————–
server01
server02
server03
server04
server04
server05

 

とても複雑になってしまいましたね。他の最適な方法があれば教えてください。