C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: DBテーブル内で文字列の連結


(過去ログ 64 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■37009 / inTopicNo.1)  DBテーブル内で文字列の連結
  
□投稿者/ わっきー (1回)-(2009/06/11(Thu) 12:17:44)

分類:[.NET 全般] 

はじめまして、わっきーと申します。

DBテーブルからDataGridViewに表示を行う際についてです。
DBテーブルに存在する要素Aと要素Bがあるとします。
これをそれぞれのカラムに表示することはプロパティの設定から容易に可能です。

私がしたいことは、要素A(text)と要素B(text)をDBテーブル上で連結させたもの(要素C)をグリッドに表示することです。
この際のSQL文の記述はどのようにすればよろしいでしょうか?
記述はデータセットデザイナのDateTableを右クリック→構成を選び、クエリビルダにより行っています。

既に実施したことを列挙します。

記述
 Select 要素A + 要素B
結果
 SQL文の実行エラー
メッセージ
 operator does not exist: text + text

記述
 Select 要素A || 要素B
結果
 SQL構文エラー発生
メッセージ
 Select句でエラー '|'の付近の式です。
 クエリテキストを解析できません。

記述
 Select 要素A & 要素B
結果
 SQL構文エラー発生
メッセージ
 Select句でエラー '&'の付近の式です。
 クエリテキストを解析できません。


開発環境
Microsoft Visual Studio 2005 C#
Windowx XP

どなたかアドバイスをお願い致します。
引用返信 編集キー/
■37012 / inTopicNo.2)  Re[1]: DBテーブル内で文字列の連結
□投稿者/ aetos (155回)-(2009/06/11(Thu) 12:54:11)
aetos さんの Web サイト
No37009 (わっきー さん) に返信

CONCAT(A,B) かな?

サーバーは何なんです?
Oracle なら || でいいと思うけど、|| って Oracle 方言でしたっけ?
引用返信 編集キー/
■37013 / inTopicNo.3)  Re[2]: DBテーブル内で文字列の連結
□投稿者/ すがり (40回)-(2009/06/11(Thu) 13:05:11)
Select 要素A + 要素B as hogehoge

Select concat(要素A,要素B) hogehoge

みたいな構文じゃないでしたっけ。

SQLServer
http://technet.microsoft.com/ja-jp/library/ms175524.aspx

Oracle
http://www.shift-the-oracle.com/sql/functions/concat.html
引用返信 編集キー/
■37014 / inTopicNo.4)  Re[3]: DBテーブル内で文字列の連結
□投稿者/ ぱると (39回)-(2009/06/11(Thu) 14:05:25)
エラーメッセージで検索するとPostgreな気がします。
引用返信 編集キー/
■37015 / inTopicNo.5)  Re[2]: DBテーブル内で文字列の連結
□投稿者/ わっきー (2回)-(2009/06/11(Thu) 14:22:02)
No37012 (aetos さん) に返信
> ■No37009 (わっきー さん) に返信
>
> CONCAT(A,B) かな?
>
> サーバーは何なんです?
> Oracle なら || でいいと思うけど、|| って Oracle 方言でしたっけ?

お返事ありがとうございます
PostgreSqlという返答で正しいでしょうか?
Visual Studio上のクエリデザイナでの動作は失敗しますが、PgAdmin上のクエリデザイナでは || で正しく動作します。
また、CONCAT(A,B)を試してみました。
固定文字列の場合は成功します

記述
 CONCAT('AAA','BBB')
結果
 'AAA''BBB'

しかし、DBの要素では正しく動作しませんでした。
引用返信 編集キー/
■37016 / inTopicNo.6)  Re[3]: DBテーブル内で文字列の連結
□投稿者/ わっきー (3回)-(2009/06/11(Thu) 14:24:02)
No37013 (すがり さん) に返信
> Select 要素A + 要素B as hogehoge
>
> Select concat(要素A,要素B) hogehoge
>
> みたいな構文じゃないでしたっけ。
>
> SQLServer
> http://technet.microsoft.com/ja-jp/library/ms175524.aspx
>
> Oracle
> http://www.shift-the-oracle.com/sql/functions/concat.html

お返事ありがとうございます。
予想ですが、私が直面している問題は
「Visual Studio上のクエリデザイナでの要素の連結方法」
だと思います。
PgAdmin上では要素の連結は || を使うことで正しく行えます。

引用返信 編集キー/
■37017 / inTopicNo.7)  Re[4]: DBテーブル内で文字列の連結
□投稿者/ わっきー (4回)-(2009/06/11(Thu) 14:24:25)
No37014 (ぱると さん) に返信
> エラーメッセージで検索するとPostgreな気がします。

お返事ありがとうございます。
申し訳ございません、記入漏れでした。
引用返信 編集キー/
■37018 / inTopicNo.8)  Re[1]: DBテーブル内で文字列の連結
□投稿者/ カドルドエグ (88回)-(2009/06/11(Thu) 14:39:51)
No37009 (わっきー さん) に返信
> 記述はデータセットデザイナのDateTableを右クリック→構成を選び、クエリビルダにより行っています。

> メッセージ
>  Select句でエラー '|'の付近の式です。
>  クエリテキストを解析できません。

> メッセージ
>  Select句でエラー '&'の付近の式です。
>  クエリテキストを解析できません。

当方も全く同じ環境(XP上でVS2005でC#)でこのようなメッセージが出たことがあります。
但しこちらはOracle 10gです。
どうやら、SQL Server以外のDBだと出やすいのかなと。
※こちらは文字連結では出たことはありませんが、INNER JOINなどで
他のテーブルとの組み合わせを行っているSQLをクエリビルダにかませると
よく出ます。

こちらでよくやっている対策として、
クエリビルダにはベースとなるテーブルの単純なSQL
例:
SELECT "HogeHoge1","HogeHoge2","HogeHoge3" FROM "FOO"
を入れて完了。
(列名、列の数をそろえた上で)あとからCommandTextプロパティに改行無しの
1行SQLをコピペする、という方法をとっています。

Postgreの場合でも通用するかはわかりませんが、
手段の一つとしてこういうのもありますよ、と^^;
引用返信 編集キー/
■37020 / inTopicNo.9)  Re[2]: DBテーブル内で文字列の連結
□投稿者/ わっきー (5回)-(2009/06/11(Thu) 15:43:24)
No37018 (カドルドエグ さん) に返信
> ■No37009 (わっきー さん) に返信
>>記述はデータセットデザイナのDateTableを右クリック→構成を選び、クエリビルダにより行っています。
>
>>メッセージ
>> Select句でエラー '|'の付近の式です。
>> クエリテキストを解析できません。
>
>>メッセージ
>> Select句でエラー '&'の付近の式です。
>> クエリテキストを解析できません。
>
> 当方も全く同じ環境(XP上でVS2005でC#)でこのようなメッセージが出たことがあります。
> 但しこちらはOracle 10gです。
> どうやら、SQL Server以外のDBだと出やすいのかなと。
> ※こちらは文字連結では出たことはありませんが、INNER JOINなどで
> 他のテーブルとの組み合わせを行っているSQLをクエリビルダにかませると
> よく出ます。
>
> こちらでよくやっている対策として、
> クエリビルダにはベースとなるテーブルの単純なSQL
> 例:
> SELECT "HogeHoge1","HogeHoge2","HogeHoge3" FROM "FOO"
> を入れて完了。
> (列名、列の数をそろえた上で)あとからCommandTextプロパティに改行無しの
> 1行SQLをコピペする、という方法をとっています。
>
> Postgreの場合でも通用するかはわかりませんが、
> 手段の一つとしてこういうのもありますよ、と^^;

お返事ありがとうございます。

プロパティより、既に動作しているテーブルに対し、要素の連結を試みてみました。

SELECT 要素A, 要素B, ・・・, 要素C || 要素D ・・・
SELECT 要素A, 要素B, ・・・, 要素C + 要素D ・・・

と実行してみましたが、どちらも正しく動作しませんでした。


引用返信 編集キー/
■37029 / inTopicNo.10)  Re[3]: DBテーブル内で文字列の連結
□投稿者/ カドルドエグ (89回)-(2009/06/11(Thu) 17:01:47)
No37020 (わっきー さん) に返信
> プロパティより、既に動作しているテーブルに対し、要素の連結を試みてみました。
>
> SELECT 要素A, 要素B, ・・・, 要素C || 要素D ・・・
> SELECT 要素A, 要素B, ・・・, 要素C + 要素D ・・・
>
> と実行してみましたが、どちらも正しく動作しませんでした。
「正しく動作しなかった」とは、
エラーが出て止まってしまったのか、
それとも、動いたけど正しくない結果を返してきたということでしょうか?

もし後者なら、
Postgreの場合、「||」を使って連結する際
coalesceという関数をはさめないと、片方がNULLのとき
返す値もNULLになってしまうことがあるとのことなので参考までに…。
参考サイト↓
http://www1.orangesoft.co.jp/RDB/rdb_memo_strcat.html
※御存じでしたらごめんなさい


どうしてもSQLでは難しい、と判断した場合、画面に表示する(DataGridViewにつなげる)前に
C#側で処理してしまうのもありかも…。



以下は文字列連結ではなくVSのDataSetデザイナの話(37016にデザイナの話が出てたので)
--------------------------------------------------------------------------------------
結局お役に立てなかったようですが;、
重要(だと個人的には思っている)なことが抜けてしまったので前スレ(37018)の方法に追記しておきます。
#「重要」なのになんで抜けたんだというのはさておき^^;

DataTableを作っている(←表現が合っているがわかりませんが)
メインクエリを(コピペ含めて)いじると同じようにエラーメッセージが発生します。(※)
そのため、変更する予定のあるクエリはメインとは別にしておくと安全です。
→結果、実際に使うのは1つだけですが、
対象のDataTableには2つのTableAdapterがくっついていることになります。


(※)
少なくともOracle(というか自分の経験)では
そのメッセージはスルーしてしまってもデータが呼べる
(右クリックの「データのプレビュー」で見ることができる / アプリ側で呼べる)
ことが多いのですが、保存時にDataSetのDesigner.csが消えることがあります。
そのままビルドしようとすると、プロジェクト内に対象のDataSetを使っているクラス(ファイル)があった場合、
「そんなモノはない」と怒られます。(「アセンブリの参照が足りない」とかそういう内容のエラーが発生)

そのときはソリューションエクスプローラで対象ファイルを右クリック→「カスタムツールの実行」を行うか
強硬手段として(汗)一度「プロジェクトから削除」→「プロジェクトに追加」を行うと
Designer.csが元に戻りビルドも通るようになります。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -