- - PR -
MySQL(2)
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 御指導の程、よろしくお願いします。 | ||||
|
投稿日時: 2004-08-17 08:12
米田です。
MySQL は得意とはいえないのですが、当たりそうなところを >mysql > select myoji + ' ' + namae as name from A_table; >を実行。期待としては以下のようになるはず。 文字列の結合ですが、 concat()関数でできないですか? 例えば concat(myoji, ' ', namae) こんな感じ >like '%田%' >like '_田' いきなり2箇所変更するのはなぜですか? ・% を _ ・% 削除 個別にテストするとポイントが絞り込めます。 | ||||
|
投稿日時: 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がどのように解釈したからなのでしょうか?また、解決方法を御指導頂ければと思います。よろしくお願いします。 | ||||
|
投稿日時: 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 ] | ||||
|
投稿日時: 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) | ||||
|
投稿日時: 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つも許す気もするのですが、バージョンが関係しますかね? | ||||
|
投稿日時: 2004-08-17 23:58
有難うございます。詳しい御指導に感謝致します。
| ||||
|
投稿日時: 2004-08-18 09:47
よねださん、ご指摘ありがとうございます。 2つしか結合できないというのは私の思い込みでして、 自分のMySQL V12.21でも、3つ以上で正しく動作しました。 ryoさん、誤った情報提供をして申し訳ございませんでした。 |