- PR -

MySQL(2)

投稿者投稿内容
kejiuyudu
ベテラン
会議室デビュー日: 2004/08/11
投稿数: 82
投稿日時: 2004-08-17 05:46
済みません、MySQLに関して、もう一つ質問があります。よろしくお願いします。

まず、以下のデータをMySQLで作成したとします。
id myoji namae
1 山田 太郎
2 吉田 花子

次に、
mysql > select myoji + ' ' + namae as name from A_table;
を実行。期待としては以下のようになるはず。
name
----------------
山田 太郎
吉田 花子

ところが結果として、
name
----------------
0
0

という具合に0で返されてしまいました。


========================================

また、 mysql > select myoji, namae from A_table where myoji like '%田%';
を実行すると、以下のように成功しました。

myoji namae
----------------
山田 太郎
吉田 花子


ところが、
mysql > select myoji, namae from A_table where myoji like '_田';
を実行すると存在しないとエラーを返されます。


これも MySQL(1) 文字化け:日本語(http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13932&forum=26&0)に記載した内容と関係があるのでしょうか?
*環境*
OS:Fedora2
MySQL:4.0.20

御指導の程、よろしくお願いします。
よねだ
常連さん
会議室デビュー日: 2002/10/13
投稿数: 22
投稿日時: 2004-08-17 08:12
 米田です。

 MySQL は得意とはいえないのですが、当たりそうなところを
>mysql > select myoji + ' ' + namae as name from A_table;
>を実行。期待としては以下のようになるはず。
 文字列の結合ですが、
concat()関数でできないですか?
例えば concat(myoji, ' ', namae) こんな感じ

>like '%田%'
>like '_田'
 いきなり2箇所変更するのはなぜですか?
・% を _
・% 削除
個別にテストするとポイントが絞り込めます。
kejiuyudu
ベテラン
会議室デビュー日: 2004/08/11
投稿数: 82
投稿日時: 2004-08-17 18:17
ご返事有難うございます。
御指導の通り、2点とも、いろいろテストをしてみました。

*1点目*
mysql> select * from tb1_stdlist where myoji like '%澤%';
+----+-------+--------+
| id | myoji | namae |
+----+-------+--------+
| 1 | 相澤 | 奈美子 |
| 3 | 澤口 | 映 |
+----+-------+--------+
2 rows in set (0.01 sec)
mysql> select * from tb1_stdlist where myoji like '_澤%';
Empty set (0.00 sec)

mysql> select * from tb1_stdlist where myoji like '%_澤%';
+----+-------+--------+
| id | myoji | namae |
+----+-------+--------+
| 1 | 相澤 | 奈美子 |
+----+-------+--------+
1 row in set (0.00 sec)

mysql> select * from tb1_stdlist where myoji like '%_澤';
+----+-------+--------+
| id | myoji | namae |
+----+-------+--------+
| 1 | 相澤 | 奈美子 |
+----+-------+--------+
1 row in set (0.00 sec)

mysql> select * from tb1_stdlist where myoji like '_澤%';
Empty set (0.00 sec)

mysql> select * from tb1_stdlist where myoji like '_澤';
Empty set (0.00 sec)

%%を両方に配置した方が確実だと分かりました。有難うございます。もしよろしければ、『%』はどういう働きがあるのですか?また、テキストではやはり、'%_澤%'では無く'_澤'になってました。これはバージョンの違いでしょうか?


============================================

*2点目(文字列の結合)*
以下のようにテストをしました。
mysql> select * from tb1_stdlist;
+----+-------+--------+
| id | myoji | namae |
+----+-------+--------+
| 1 | 相澤 | 奈美子 |
| 2 | 山本 | 太月 |
| 3 | 澤口 | 映 |
| 4 | 小林 | 麻衣子 |
+----+-------+--------+
4 rows in set (0.00 sec)

mysql> select concat (myoji, ' ' , namae) as name from tb1_stdlist;
ERROR 1064: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '(myoji, ' ' , namae) as name from tb1_stdlist' at line 1

mysql> select concat(myoji + ' ' + namae) as name from tb1_stdlist;
+------+
| name |
+------+
| 0 |
| 0 |
| 0 |
| 0 |
+------+
4 rows in set (0.00 sec)

上記のようにまた、0で返されます。これはMySQLがどのように解釈したからなのでしょうか?また、解決方法を御指導頂ければと思います。よろしくお願いします。


taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2004-08-17 20:34
>*1点目*
'_'は1文字をワイルドカードとするもの(0文字ではダメ)、
'%'は何文字でも(0文字でも)ワイルドカードとするものです。
'_'というのは、とにかく1文字なければダメなのです。
'_澤'で検索すると、'戸澤'や'三澤'はヒットしても'小金澤'や'澤口'はヒットしません。
それに対して、'%'は0文字でも2文字以上でもヒットするので、
'%澤%'で検索すると、'戸澤''三澤'小金澤''澤口'の全てがヒットします。
以下のURLを参考にしてください。
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_11.htm

>*2点目(文字列の結合)*
'+'は数値にしか使えません。0になるのは文字列は全て0と解釈されるからです。
文字列の結合にはよねださんのおっしゃるとおりconcat()を使用しなければいけません。
3つを結合するならconcat(myoji, concat(' ', namae))でしょう。
以下のURLを参考にしてください。(このサイトは本当にためになります。)
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_14.htm


[ メッセージ編集済み 編集者: taro 編集日時 2004-08-17 20:36 ]
kejiuyudu
ベテラン
会議室デビュー日: 2004/08/11
投稿数: 82
投稿日時: 2004-08-17 22:03
なるほど、concat で、くっつけたものを更に concat でくっつけるのですのね。有難うございます。以下のようにうまくいきました。
mysql> select concat(myoji, concat(' ', namae)) from tb1_stdlist;
+-----------------------------------+
| concat(myoji, concat(' ', namae)) |
+-----------------------------------+
| 相澤 奈美子 |
| 山本 太月 |
| 澤口 映 |
| 小林 麻衣子 |
+-----------------------------------+
4 rows in set (0.00 sec)
よねだ
常連さん
会議室デビュー日: 2002/10/13
投稿数: 22
投稿日時: 2004-08-17 23:04
 米田です。

 taro さんフォローありがとうございます。
>文字列の結合にはよねださんのおっしゃるとおりconcat()を使用しなければいけません。
>mysql> select concat (myoji, ' ' , namae) as name from tb1_stdlist;
 気になるのは、これだけ concat関数と ( の間にスペースがあることなんですが、MySQL
って大丈夫だったかな?
 一応
http://dev.mysql.com/doc/mysql/ja/String_functions.html
>CONCAT(str1,str2,...)
>引数を連結した結果の文字列を返す。いずれかの引数が NULL のときは NULL を返す。
>3 つ以上の引数の指定が可能。数値型の引数は同等の文字列形式に変換される。
>mysql> SELECT CONCAT('My', 'S', 'QL');
3つも許す気もするのですが、バージョンが関係しますかね?

kejiuyudu
ベテラン
会議室デビュー日: 2004/08/11
投稿数: 82
投稿日時: 2004-08-17 23:58
有難うございます。詳しい御指導に感謝致します。
taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2004-08-18 09:47
引用:

3つも許す気もするのですが、バージョンが関係しますかね?



よねださん、ご指摘ありがとうございます。
2つしか結合できないというのは私の思い込みでして、
自分のMySQL V12.21でも、3つ以上で正しく動作しました。
ryoさん、誤った情報提供をして申し訳ございませんでした。

スキルアップ/キャリアアップ(JOB@IT)