2009-08-14 4 views
6

Ich bin mit dieser Art von Syntax in SQL Server vertraut ist, in Strings in meinem Ergebnismenge zu verketten:Ist es möglich, String-Verkettung in einer ColdFusion Query of Queries durchzuführen?

SELECT 'foo' + bar AS SomeCol 
FROM SomeTable 

würde Ich mag etwas ähnliches in einer Coldfusion-Abfrage aus Abfrageergebnissen tun:

<cfquery name="qOptimize" dbtype="query"> 
    select 
     image_id AS imageId, 
     '#variables.img_root#' + image_id + '.' + image_ext AS fullImage, 
     '#variables.img_root#' + image_id + 't.' + image_ext AS thumbnailImage, 
    from qLookup 
    order by imageId asc 
</cfquery> 

Dies ist Teil eines Dienstes, der von einer Flex-Anwendung genutzt wird. Daher optimiere ich das Ergebnis einer gespeicherten Prozedur, die an anderer Stelle in der Anwendung verwendet wird, um nicht verwendete Spalten zu entfernen und Bild-URLs aus dynamischen Pfadinformationen zu kompilieren .

Ich konnte eine neue gespeicherte Prozedur schreiben, die das Bild Wurzel als Parameter annimmt und tut all dies, und ich wahrscheinlich wird aus Performance-Gründen, aber die Frage ist immer noch nörgelnden mich. Ich habe noch keine Syntax gefunden, die funktioniert, also frage ich mich, ob es möglich ist.

Wenn ich die oben versuchen, erhalte ich die folgende Fehlermeldung:

Query Of Queries syntax error.
Encountered "from. Incorrect Select List, Incorrect select column,

Hat jemand getan? Ist es möglich, vielleicht mit einer anderen Syntax?

Antwort

11

Ja, das ist möglich. Ich denke, das Problem ist, dass image_id höchstwahrscheinlich ein numerischer Wert ist. Wenn Sie es als Varchar darstellen, sollte es in Ordnung sein.

+0

ich in diese lief, wenn ich es auf eine gespeicherte Prozedur umgewandelt, aber Vielen Dank. –

+0

Aber wie man denselben String concat wenn Postgres-Datenbank verwendet –

+0

Mit dem ANSI-Standard-Verkettungsoperator '||' –

5

Ich denke, der Fehler, den Sie erwähnen, ist wegen des Kommas bei der letzten Verkettung, am Ende von thumbnailImage.

meine nur 0.002

+0

Agree 100%. Wenn der Beispielcode der tatsächlich verwendete Code war, war das letzte Komma der Deal-Breaker. Gute Stelle. – jyoseph

0

$ oder sogar, wenn Sie die concatenate nicht auf Coldfusion-Ebene müssen aber in der Abfrage selbst:

in meinem Beispiel, ich habe bereits ein Abfrageergebnis Objekt, das ich graben will mit Abfrage von Abfragen. die Abfrage Resul TObject hat 10 Spalten von Daten und 1000 Zeilen, die Spaltennamen sind c1, c2, c3, c4, c5, ...

<cfset dbzeilerest = "2 4 - 3"><!--- beg qoq to concatenate those columns ---> 
    <cfset sqlcodehere = "("> 
    <cfloop list="#dbzeilerest#" delimiters="," index="t"> 
     <cfif val(t) GT 0> 
      <cfset sqlcodehere = sqlcodehere & "C" & val(t) & " || "> 
     <cfelse> 
      <cfset sqlcodehere = sqlcodehere & "'" & t & "' || "> 
     </cfif> 
    <!--- concat in coldfusion sql qoq: 
      (C2 || ' ' || C4 || ' ' || '-' || ' ' || C3) as combii ---> 
    </cfloop> 
    <cfset sqlcodehere = sqlcodehere & " '') as combii"> 
    <cfquery name="dbtexttemp2" dbtype="query"> 
    SELECT DISTINCT #PreserveSingleQuotes(sqlcodehere)# FROM dbtexttemplistequery 
    </cfquery> 
+0

Das klingt nach einem sehr speziellen Fall. Im Allgemeinen ist es besser, dynamic sql wenn möglich zu vermeiden, da es "Datenbank" -Abfragen auf sql injection verfügbar machen kann. Nicht zu vergessen, es ist oft schwieriger für eine db zu optimieren. – Leigh

Verwandte Themen