2010-11-10 26 views
2

J'ai une requête avec une concaténation complexe en elle. C'est quelque chose dans le sens de la concaténation des résultats de plusieurs sous-sélections si les résultats ne sont pas nuls. Il fonctionne très bien (bien que la complexité me fait un peu malade) sur notre serveur de développement qui fonctionne MySQL 5.1 mais notre serveur de production, qui gère 5,0 rapportsMySQL 5.0 rapport "concat n'existe pas"

FUNCTION database.concat does not exist 

Toute idée pourquoi cela pourrait être? La mise à niveau n'est malheureusement pas une option à ce stade, donc à moins que quelqu'un ait une bonne idée, je suis à peu près coincé en train de réécrire ce rapport. La requête est la suivante (Oui, je me rends compte que j'utilise horriblement mysql.) Mettons cela de côté pour l'instant Si quelqu'un sait comment faire pour se référer à un sous-ensemble par alias qui serait pratique, mais je n'ai jamais été en mesure de le faire, d'où la sous-requête répétée. retourne également concaténer NULL si l'un des arguments sont NULL, d'où l'instruction if.)

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 
+0

'contact' ou' concat'? – Quassnoi

+0

Nous ne pouvons pas détecter les fautes de frappe, etc. sans un extrait. Concat devrait être là et ne prendre que deux arguments. –

+2

@Matt William concat peut prendre un nombre arbitraire arguments selon http://dev.mysql.com/doc/refman/5.0/fr/string-functions.html#function_concat – baudtack

Répondre

14

Et assurez-vous qu'il n'y a pas d'espace entre concat et (. Quelque chose comme ça:

SELECT CONCAT ('a', 'b'); 
+0

Merci pour la suggestion. Pas le problème cependant. – baudtack

+0

Comme je vous l'ai dit, il y a un espace entre concat et '('. MySQL 5.0 avait un tel problème.Il a été résolu en 5.1 – rMX

+0

Typo, désolé.S'enverra une requête simplifiée dans un instant – baudtack

3

CONCAT est avaiable dans 5.0.

Assurez-vous que vous n'avez pas une faute de frappe:

SELECT CONTACT(id, name) 
FROM items; 

Error Code: 1305 
FUNCTION test.CONTACT does not exist 
+0

ouais, vous OP tapant "conact" au lieu de "concat" .... –

+0

Ouais, désolé, c'était juste dans ma question. La même requête s'exécute sur notre serveur de développement sous 5.1, mais pas sous 5.0, donc je sais que ce n'est pas un problème de typo. – baudtack

1

Je réécrit la requête en utilisant concat_ws qui ignore simplement NULL valeurs au lieu de retourner NULL comme concat fait. Voici le résultat qui est grandement simplifié et fonctionne réellement.

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