質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

2987閲覧

SQL Server ある列のレコード内の特定の文字を含む部分だけを抜き出し新しい列に保存したい

minhouse10

総合スコア41

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/10/31 15:22

SQL Server ある列の各レコード内にXMLフォーマットで行数23行ぐらいのデータが格納されています。カラムのデータタイプ自体はvarcharで指定されております。
この各レコード行から<messageKey>XXXX</messageKey>ような特定タグの開始と終了部分の行のみを抜き出し、新しい別カラムとして保存したいのですが、カラムがXMLデータタイプではないためかXMLデータ操作用の関数がクエリで使えない事が分かりました。また以下のようなwhere句を使ってもレコード全体が取れてしまい目的の情報だけをうまく抜き出す事ができておりません。このようなタグを含むデータが数万行とかなり多くヒットするため少ない必要な情報だけを一覧化したいと思ったのがきっかけです。

select * from テーブル名 where 列名 like '%<messageKey>%'

どなたか何か良い方法があればご教授頂けますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

カラムがXMLデータタイプではないためかXMLデータ操作用の関数がクエリで使えない事が分かりました。

XML型にCASTしても使えないのでしょうか?それともCASTでエラーになるのでしょうか?
XML データのインスタンスの作成

必要な情報だけを一覧化したい

CASTが可能なら、XQueryでの検索も可能です。
XQuery 言語リファレンス (SQL Server)

投稿2018/11/01 01:57

sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minhouse10

2018/11/01 02:34

sazi様、ご回答頂き、ありがとうございます!ご指摘の通りCastする事を考えましたが、レコード数が多いため、試すのを躊躇しておりましたが、簡単なテーブルをテスト環境に作ってCASTしてからXML関数を使う方法ためしてみます!
guest

0

ベストアンサー

こんにちは!
とりあえず、こんな感じで提示されたタグの抜出
閲覧だけなら新しい別カラムとして保存するのではなくViewを生成して閲覧できるようにしておいたほうがよいかと思います。

SQL

1select substring(列名,charindex('<messageKey>',列名),charindex('</messageKey>',列名) + len('</messageKey>') - charindex('<messageKey>',列名)) from テーブル名 where patindex('%<messageKey>%</messageKey>%',列名) <> 0

<messageKey></messageKey>が0~1つ存在することを前提とします。
SQLServer2012で確認しています。

投稿2018/11/01 00:45

編集2018/11/07 04:06
mikupedia

総合スコア159

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minhouse10

2018/11/01 02:32

mikupedia様、ご回答頂き、ありがとうございます!substring関数の利用は考えましたが、このようなViewの生成は思いつきもしませんでした。早速試してみます!
alg

2018/11/07 03:43

うーん、SQL Server についての質問なのに「PostgreSQLで動作確認しています」というのは、ちょっといかがなものでしょうか。 現に後半の `substring(列名,'(<messageKey>.*</messageKey>)')` はSQL Serverでは使えませんし。
mikupedia

2018/11/07 04:07

失礼しました、追記が蛇足となってしまいましたので削除しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問