●サーバー機
DB:SQLServer2005
OS:WindowsServer2003
●クライアント機
OS:WindowsXP SP3
住所テーブル(ADDRESS)の項目のひとつである電話番号(TELNO)を
特定の記号で3つの別項目として取得したいのですが
クライアント機の SQL Server Management Studio にてクエリを実行すると
「SUBSTRING 関数に渡した長さのパラメータが無効です。」
以上のようなエラーが発生します。
電話番号の項目は文字型の項目で、実際のデータとしては
例:(01)2345-6789
(0123)45-6789
(01234)5-6789
こんな感じで市外局番の前後に必ず"(" ")"が付いており"-"も必ず付いた状態です。
ただし、市外局番、ハイフンの前後の番号の桁数に決まりはありません。
※市外局番5桁、ハイフン前4桁、ハイフン後4桁という最大桁数の制限はあり。
【実行したクエリ】
Select
SUBSTRING(TELNO, CHARINDEX('(',TELNO)+1, CHARINDEX(')',TELNO)-CHARINDEX('(',TELNO)-1) AS TELNO1
, SUBSTRING(TELNO, CHARINDEX(')',TELNO)+1, CHARINDEX('-',TELNO)-CHARINDEX(')',TELNO)-1) AS TELNO2
, SUBSTRING(TELNO, CHARINDEX('-',TELNO)+1, 5) AS TELNO3
From ADDRESS
エラーメッセージの通り、SUBSTRING関数のパラメータの内容が長すぎるのが原因のようですが
いろいろ調べてみたのですが別の書き方が見つけられず困っている状態です。
何かいい方法はないものでしょうか?(別の関数を使用する等々)
※ストアドプロシージャで処理するのではなく1本のクエリで結果が得られるのが望ましいです。
よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
>電話番号の項目は文字型の項目で
charですか?
それともvarcharですか?
>電話番号の項目は文字型の項目で、実際のデータとしては
>例:(01)2345-6789
> (0123)45-6789
> (01234)5-6789
>こんな感じで市外局番の前後に必ず"(" ")"が付いており"-"も必ず付いた
>状態です。
>ただし、市外局番、ハイフンの前後の番号の桁数に決まりはありません。
>※市外局番5桁、ハイフン前4桁、ハイフン後4桁という最大桁数の制限はあり。
得たい結果を示しましょう。
エラーになるクエリから、回答者側で得たい結果を推測するのは容易ではありません。
当方、SQL Server 2005 Expressですが、提示されたデータ及びクエリで市外局番、市内局番、加入者番号の三つに分割した結果を正常に得られました。
データ中に、形式が正しくないものが含まれているのでは?
この回答への補足
>charですか?
>それともvarcharですか?
char型の14桁の項目です。
>得たい結果を示しましょう。
(01)2345-6789 が入っていた場合
TELNO1 として 01
TELNO2 として 2345
TELNO3 として 6789
を取得したいのです。
電話番号以外の項目で検索条件を付加して
対象件数を絞った時はこのエラーがでない場合があります。
※この住所テーブルの件数は現状で7万件ほどあります。
(情報後出しのようになってしまい申し訳ないです。)
No.3
- 回答日時:
以下のようなスクリプトでもチェックできるかな
dim cn
dim rst
dim re
set cn = createobject("ADODB.connection")
set rst = createobject("ADODB.recordset")
set re = createobject("VBScript.RegExp")
re.pattern = "^\(\d+\)\d+-\d+$"
cn.ConnectionString = "provider=sqloledb;data source=xxx;initial catalog=xxx;user id=xxx;password=xxx"
cn.Open
rst.Open "select telno from address", cn, 3
Do Until rst.EOF
if re.test(rst.fields("telno")) then
else
WScript.Echo rst.fields("telno")
end if
rst.MoveNext
Loop
No.2
- 回答日時:
No.1さんの書かれた通り、おそらく7万件の中にエラーデータが含まれていると思います。
Transact-SQLはRegExpは使えませんが、簡単なパターンチェックはできますので、まずは以下の対象がないかどうか確認してみてください。SELECT * FROM ADDRESS WHERE PATINDEX('(%)%-%',TELNO)=0
今朝、早速データを確認してみたところ数件 01-23456-7890
というような規定のフォーマットに沿わないデータが存在しました。
エラーメッセージの文言から判断して、データ自体には不具合はないと判断してしまっていたのが間違いでした。
jamshid6さんに提示していただいたチェッククエリを参考に以下のようにクエリを修正しました。
Select
, CASE WHEN PATINDEX('(%)%-%',TELNO) <> 0 THEN SUBSTRING(TELNO, CHARINDEX('(',TELNO)+1, CHARINDEX(')',TELNO)-CHARINDEX('(',TELNO)-1) ELSE '' END AS TELNO1
, CASE WHEN PATINDEX('(%)%-%',TELNO) <> 0 THEN SUBSTRING(TELNO, CHARINDEX(')',TELNO)+1, CHARINDEX('-',TELNO)-CHARINDEX(')',TELNO)-1) ELSE '' END AS TELNO2
, CASE WHEN PATINDEX('(%)%-%',TELNO) <> 0 THEN SUBSTRING(TELNO, CHARINDEX('-',TELNO)+1, 5) ELSE '' END AS TELNO3
From ADDRESS
chukenkenkouさん、jamshid6さん どうも有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「A,B組の女子の氏名のよみ。 1 2023/05/16 15:28
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- iPhone(アイフォーン) web上の電話番号リンクの桁区切りが、iPhoneだと特定電話番号でおかしくなるのを解決したい 1 2023/03/28 14:27
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- Visual Basic(VBA) 最終列の右へSUM関数を作成するため下記コードを実行しましたが、最終列「10月28日」が上書きされて 3 2022/12/05 20:32
- Excel(エクセル) SUMIFのIF分岐について 4 2023/04/15 12:57
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Yahoo!メール Yahooメールにログインできません 2 2022/12/12 07:46
このQ&Aを見た人はこんなQ&Aも見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
家・車以外で、人生で一番奮発した買い物
どんなものにお金をかけるかは人それぞれの価値観ですが、 誰もが一度は清水の舞台から飛び降りる覚悟で、ちょっと贅沢な買い物をしたことがあるはず。
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
とっておきの「まかない飯」を教えて下さい!
飲食店で働く方だけが食べられる、とっておきの「まかない飯」。 働いてらっしゃる方がSNSなどにアップしているのを見ると、表のメニューには出てこない秘密感もあって、「食べたい!!」と毎回思ってしまいます。
-
SQLServerで文字列の末尾からある位置で取出
SQL Server
-
SQL文で右から1文字だけ削除するやり方
MySQL
-
型 varchar から型 numeric への変換エラー。
その他(データベース)
-
-
4
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
5
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
6
副問合せの書き方について
SQL Server
-
7
MS SQLServer のSQLで文字列の前にN:
その他(データベース)
-
8
「警告 : NULL 値は集計またはその他の SET 演算で削除されました。」
SQL Server
-
9
含まない言い方ってどうしたらいいんでしょうか
日本語
-
10
SQLServer2005のSQL文での別名の取り扱い
SQL Server
-
11
ビューのソートについて
SQL Server
-
12
SQLserver2005 nvarchar を float に変換中にエラー発生
SQL Server
-
13
GROUP BYでエラーが発生
SQL Server
-
14
SQLで列名を変数にできないでしょうか
SQL Server
-
15
SQL文のwhere条件文で使う <> の意味はなんですか
その他(データベース)
-
16
Accessにインポートしたら並び順が変わっちゃった
Access(アクセス)
-
17
レコードの登録順がおかしい
MySQL
-
18
VB.NETで、EXCELの右寄せ
Visual Basic(VBA)
-
19
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
20
Accessのフィールド数が255しかない=業務では使えない?
PowerPoint(パワーポイント)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
Oracle 2つのDate型の値の差を...
-
必須入力項目と入力必須項目
-
エクセルグラフの凡例スペース
-
VBAで複数の数式セルを最終行ま...
-
Access テキスト型に対する指定...
-
ORACLEでLONG項目からCHAR項目...
-
Access又はExcelで256項目を超...
-
ORACLE SQL 文末 文字列 削除の...
-
datファイルからaccessにインポ...
-
空白をそのままインポートする...
-
Accessで数値型にNULLをInsert...
-
SUBSTRING 関数に渡した長さの...
-
Accessの表形式のフォームについて
-
APN設定について教えていただけ...
-
Excelで空白以外の値がある列の...
-
複数のレコードを1つのレコード...
-
EXCEL VBA データの...
-
セルの右クリックで出る項目を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 2019 のピボットテーブル...
-
エクセルVBAで5行目からオート...
-
Oracle 2つのDate型の値の差を...
-
Access テキスト型に対する指定...
-
セルの右クリックで出る項目を...
-
エクセルグラフの凡例スペース
-
SUBSTRING 関数に渡した長さの...
-
必須入力項目と入力必須項目
-
空白をそのままインポートする...
-
VBAで複数の数式セルを最終行ま...
-
Accessで数値型にNULLをInsert...
-
datファイルからaccessにインポ...
-
access2000:フォームで入力し...
-
複数のレコードを1つのレコード...
-
ORACLEでLONG項目からCHAR項目...
-
SELECT文でLEFT関数を使うと未...
-
条件に一致した列の非表示の仕...
-
他テーブルで一致する列から名...
-
BIOSでAHCIに設定したいが、項...
-
APN設定について教えていただけ...
おすすめ情報