3

複雑な連結を含むクエリがあります。結果がnullでない場合、いくつかのサブ選択の結果を連結するという行に沿ったものです。MySQL 5.1 を実行する開発サーバーと 5.0 レポートを実行する実稼働サーバーでは問題なく動作します (ただし、その複雑さには少しうんざりします)。

FUNCTION database.concat does not exist

なぜこれが考えられるのでしょうか?残念ながら、アップグレードは現時点ではオプションではないため、誰かが優れたアイデアを持っていない限り、このレポートを書き直すことはほとんどありません。

クエリは次のとおりです (はい、私は mysql をひどく悪用していることに気付きました。今はそれを脇に置きましょう。便利な別名でサブセレクトを参照する方法を誰かが知っていれば、しかし私はできませんでした)また、concat はNULL引数のいずれかがNULL

select (concat(if((select 
                       concat(if(b.foo is not null, b.foo, ""), 
                       " ", 
                       if(f.bar is not null, f.bar, ""))
                     from  `foo_table`  as f
                      left join `bar_table` as b
                        on b.SOME_ID = f.SOME_ID
                     where f.STUDENT_ID = t.STUDENT_ID
                       and bar.NewID = t.OldID order by bar.id limit 1) is not null,
                   (select 
                      concat(if(b.foo is not null, b.foo, ""), 
                       " ", 
                       if(f.bar is not null, f.bar, ""))
                     from  `foo_table`  as f
                      left join `bar_table` as b
                        on b.SOME_ID = f.SOME_ID
                     where f.STUDENT_ID = t.STUDENT_ID
                       and bar.NewID = t.OldID order by bar.id limit 1),
                   ""),
       " ",
       t.reason) as Reason
   from table as t
4

3 に答える 3

18

concatと の間に空白がないことを確認して(ください。そんな感じ:

SELECT CONCAT ('a', 'b');
于 2010-11-10T19:23:44.910 に答える
5

CONCATで利用可能です5.0

タイプミスをしていないことを確認してください。

SELECT  CONTACT(id, name)
FROM    items;

Error Code: 1305
FUNCTION test.CONTACT does not exist
于 2010-11-10T19:19:53.053 に答える
2

値を返すのではなく、単純に値を無視concat_wsするクエリを書き直しました。これは、大幅に単純化され、実際に機能する結果です。NULLNULLconcat

select concat_ws(" ", 
                 (select 
                    concat_ws(" ", b.bar, f.foo)
                   from  `foo_table`  as f
                   left join `bar_table` as  b
                     on b.SOME_ID = f.SOME_ID
                  where f.STUDENT_ID = t.STUDENT_ID
                    and f.NewID = t.OldID order by f.id limit 1 ),
               t.reason) as Reason,
   from table as t
于 2010-11-10T19:54:15.170 に答える