MYSQL5.5でCONCAT以外で文字列連結できるでしょうか?
調べてみると他のDBは「||」が使えるみたいですが、mysqlは使えません。
何かCONCAT以外で代替きかないかなと思い質問させて頂きました。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

MySQLの独自構文と、標準SQLの構文を体感するごく簡単な例を作ってみました。




-- テスト用の表定義&データ
drop table if exists `t1`;
create table t1
(`c1` int primary key
,`c1-1` int
,`c2` varchar(5)
,`c3` varchar(5)
,`dt` date
);

insert into t1 values
(1,100,'abc','xyz','2011-04-01')
;


-- SQLモードの確認
select @@global.sql_mode;
select @@session.sql_mode;


-- MySQL構文とANSI構文の違い、引用符の意味などを確認するSQL例
select
*
, 1 -- 数値定数
, c1-1 -- 「列c1-1」という減算
, 'c1-1' -- 「'」(単一引用符)で囲んだものは文字定数
, "c1-1" -- 「"」(二重引用符)で囲んだものは、
-- MySQL構文モードでは文字定数
-- ANSI構文モードでは、列名など名前。
, `c1-1` -- 「`」(バッククォート)で囲んだものは、
-- MySQL独自仕様であり、列名など名前。
, 'abc'||'def' -- 「||」は、
-- MySQL構文モードでは、論理演算のor
-- ANSI構文モードでは、文字連結
, concat('abc','def') -- MySQL独自の文字連結関数
, 2011-04-14 -- yyyy-mm-ddを文字定数として指定しないと、
-- 日付でなく、単なる整数の減算として扱われる
, '2011-04-14' -- 'yyyy-mm-dd'といった形式の文字定数は、
-- 日付データ型と型変換してくれる。
from t1
;


-- この接続だけ、一時的にANSI構文モードに変更
set @@session.sql_mode='ANSI';

この後、上述のselect文を再度、実行して結果の違いを確認してみてください。
    • good
    • 0
この回答へのお礼

凄いです!こんな方法があるとは・・・感謝感謝です!ありがとうございます!

お礼日時:2011/04/19 17:56

言語によって関数の書式や演算子の意味が異なることはよくあること


||はMySQLではORですから連結演算子にはつかえません。

http://dev.mysql.com/doc/refman/5.1/ja/extension …

移植性を考慮してのことでしょうけど、すでに定義されているものを
いじるとなるとそちらのケアまで考慮しないといけないので
かえって問題が広がる可能性があることも考慮してください
(つまり素直にCONCATつかいなさい・・・ってことなんですけど)
    • good
    • 0
この回答へのお礼

お察しのとおりなのですが、CONCATを使いなさいということですね。わかりました!ご丁寧にありがとうございました!!

お礼日時:2011/04/19 17:57

質問の意図が分かりません。


どういう理由で、代替手段を必要としているのでしょうか?

まず、MySQLでは、SQLの構文モードが存在します。インストール時の標準設定では、MySQL構文モードになっています。
標準SQLや主要なRDBMSでは、「"」(二重引用符)で囲んだものは、表名や列名などの名前ですが、MySQL構文モードでは、文字定数になります。

一方、標準SQL準拠にするには、SQLモードでANSI構文モードにするといった方法があります。
http://dev.mysql.com/doc/refman/5.1/ja/server-sq …


それ以外には、アプリ側でやるとかいろいろ方法は考えられます。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDBエラーの意味

フォームからDBにデータ挿入しようとすると

Column count doesn't match value count at row 1

というエラーが出てしまいます・・・どういう意味を持ったエラーなんでしょうか?

Aベストアンサー

カラム数と値の数が合わない、と言う事です。簡単な英語なので覚えましょう。
カラム数が4つにもかかわらず、
"INSERT INTO tablename VALUES (1,'hoge',3)"
とやった場合等に出るエラーだと思います。

QERROR1062:Duplicate entry.....というエラーが出てしまいました

いつもお世話になります。
データベースからSELECTで抽出したデータを別のテーブルにINSERTするSQLを実行したのですが、
ERROR1062:Duplicate entry.....というエラーが出てしまいました。
お詳しい方がいらっしゃいましたら、アドバイスをいただけませんでしょうか?よろしくお願いいたします。
【実行したSQL】
INSERT INTO tblA (dataA1, dataA2, dataA3, dataA4) SELECT "9001","AA",dataB1,dataB2 FROM tblB WHERE dataB1 = 52

tblAの主キー:dataA1とdataA2
tblBの主キー:dataB1

dataA1とdataA2はtblAの主キーとなっているため、重複してしまうということのようです。tblBの主キーはdataB1であるため、抽出されてくるデータは常に1件なので問題ないと期待していましたが、甘くなかったようです。何か良い方法はないものでしょうか?よろしくお願いいたします。

Aベストアンサー

「ERROR 1062」は、重複データを格納しようとした場合に出力されるエラーです。
既にdataA1='9001'&dataA2='AA'という行が、tblAに格納されているのですよね?

>抽出されてくるデータは常に1件なので問題ないと期待していました

「insert ~ select ~」を実行前に、既に同じデータが格納されているのでは?
あるいはprimary keyの指定が、質問中に記された通りでなく、2件以上検索されているかです。

>何か良い方法はないものでしょうか?

何をするための方法を、聞きたいのかが分かりませんが?

QMySQLで改行を含む文の登録のしかた(改行コード

MySQLで改行を含む文を登録したいんですが、改行を改行コードに書き換えて登録したいです。
改行コードはどのように書けばいいですか?

登録したい文:
あいうえお
かきくけこ
さしすせそ

Aベストアンサー

改行コードは¥nで登録すれば良いです。

QCSVファイルの中で、「 , 」カンマを使いたい

「 , 」で区切られたCSVファイルの中で、「 , 」カンマを使いたいのですが、可能でしょうか?

具体的には「これは1,500円でした。」というように、CSVファイルに収められた文章内で出てくる半角の数字(お金)の区切りに使いたいのです。
全角では代用したくないのですが、CSVファイルでデータを受け渡しする際に、困っています。

例えば、特殊文字などで対応可能でしょうか?

Aベストアンサー

受け渡しに使うと言うことは相手方のアプリケーションのことも考えなければいけないのですが・・・とりあえず対応が簡単そうな方法を。

1.各セルを""で囲む。(もちろんデータにダブルクォートがある場合はカンマと同様に困ります。
2.カンマで区切らずにタブで区切る。(比較的使われない文字ですが、やはりデータ中にタブがあるとカンマと同様です)

難しいけれど完璧に対応するためには、データ中の区切り文字は特殊な文字列に変更し、受け取り側のアプリケーションではその特殊な文字列をデータ中の区切り文字として扱うという方法が使われます。
例えば、データ中のカンマは\,にするとか。

データ作成側、受け取り側でそれぞれどこまで対応できるのか分かるともっと簡単かつ具体的な方法を回答できるかも知れません。

QERROR 1054 (42S22) 原因不明です

idはintでプライマリー
a5はchar(10)で日本語文字列を格納

データを取得しようとすると#1054エラーがでます。

admin--------
SELECT * FROM `aaa` WHERE `a5`=`あいうえおかき`
#1054 - Unknown column 'ã

moniter--------
mysql> SELECT * FROM `aaa` WHERE `a5`=`あいうえおかき`;
ERROR 1054 (42S22): Unknown column '縺ゅ>縺・∴縺翫°縺・ in 'where clause'


`あいうえおかき`の日本語に問題があると思い半角データを1行だけ更新しました。
admin--------
SELECT * FROM `aaa` WHERE `a5`=`abcde`
#1054 - Unknown column 'abcde' in 'where clause'

moniter--------
mysql> SELECT * FROM `aaa` WHERE `a5`=`abcde`;
ERROR 1054 (42S22): Unknown column 'abcde' in 'where clause'


admin--------
moniter--------
SELECT * FROM `aaa` WHERE `a5`
SELECT `a5` FROM `aaa` WHERE 1
SELECT * FROM `aaa` WHERE `id`=89584
成功

idはintでプライマリー
a5はchar(10)で日本語文字列を格納

データを取得しようとすると#1054エラーがでます。

admin--------
SELECT * FROM `aaa` WHERE `a5`=`あいうえおかき`
#1054 - Unknown column 'ã

moniter--------
mysql> SELECT * FROM `aaa` WHERE `a5`=`あいうえおかき`;
ERROR 1054 (42S22): Unknown column '縺ゅ>縺・∴縺翫°縺・ in 'where clause'


`あいうえおかき`の日本語に問題があると思い半角データを1行だけ更新しました。
admin--------
SELECT * FROM `aaa` WHERE `a5`=`abcde`
#1054...続きを読む

Aベストアンサー

> SELECT * FROM `aaa` WHERE `a5`=`abcde`

こうしてみるとか:

SELECT * FROM aaa WHERE a5='abcde'

参考:
http://dev.mysql.com/doc/refman/5.1/ja/identifiers.html
http://dev.mysql.com/doc/refman/5.1/ja/string-syntax.html

QHTMLフォームのSELECTの幅を一定にするためには?

HTMLフォームのSELECTの幅を一定にするためにはどのようにすれば
いいのでしょうか?

CSS等で設定できるとありがたいのですが、やり方がわかりません。

Aベストアンサー

<select style="width: 200px">

QSELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか

SELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか?
MYSQLサーバのバージョンは5.0.77です。

下記のように「*」を使用して指定テーブルの全カラムを表示する方法がありますが、
SELECT TableName.* FROM TableName

上記の逆で、指定テーブルの指定カラム以外の全カラムを一括指定って可能でしょうか?
例えば下記のような「^」みたいな、又は同等な書き方があれば良いなと思ってまして。
SELECT TableName.^ColumnName1 FROM TableName

ちなみに、下記のように一つ一つ表示したいカラムを指定する方法以外です。
SELECT TableName.ColumnName2 , TableName.ColumnName3 FROM TableName

よろしくお願いします。

Aベストアンサー

ない。
SQL文でそんなことをするより、メソッドとして作ればいいんじゃないですか。
だいたい、それ以外のカラムの数がわからないし、並びも不明だし。

#1に方と同じで
SELECT * from xxxx
なんてのは正気の人間は書きません。
カラムの数も位置も属性もわからないSQL文の結果をどうやって扱うのか。

QINSERT時に発番を行いたい

ATBLからBTBLへのINSERT時発番を行いたい

<環境>
SQLSERVER 2008

<ATBL>
CDvarchar(3)KEY
NOintKEY
NAMEvarchar(10)

<BTBL>
CDvarchar(3)KEY
NOintKEY
NAMEvarchar(10)

<BTBLのデータ>
CD   NO  NAME
0011太郎
0013次郎
0015三郎

BTBLをATBLへINSERTしたいのですが、この時、NOを1から再付番したいのです。
INSERTクエリで一発で更新できますでしょうか?
ご教授お願いします。

Aベストアンサー

row_numberで1からの連番ふれるよ

INSERT INTO ATBL(CD, NO, NAME)
SELECT CD, row_number() OVER(ORDER BY CD) AS NO, NAME FROM BTBL

参考URL:http://msdn.microsoft.com/ja-jp/library/ms186734.aspx

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報