Ankündigung

Einklappen
Keine Ankündigung bisher.

Funktion in einer Where-Klausel aufrufen?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Funktion in einer Where-Klausel aufrufen?

    Ich habe die folgende Where-Klausel die mir eine bestimmte Sortierung macht, das würde so funktionieren

    PHP-Code:
     $SQL_Where "ORDER BY `t10`.`kdatum`"
    In der Ausgabe lasse ich mir aber nicht den Wert von kdatum ausgeben sondern berechne diesen vorher mit einer Funktion

    PHP-Code:
      wert fkt21_Haltedauer($Performance[$index]['kdatum']) 
    D.h. ich kann in der Where-Klausel nicht direkt nach kdatum sortieren sondern möchte "kdatum" an die Funktion übergeben und nach dem Funktionswert
    soll dann sortiert werden.

    PHP-Code:
     //Versuch1:
     
    $SQL_Where "ORDER BY " fkt21_Haltedauer( . "`t10`.`kdatum`" .);
     
    //Versuch2:
     
    $SQL_Where "ORDER BY " fkt21_Haltedauer(`t10`.`kdatum`); 
    Fehlermeldung Versuch 1: unexpectedt "."
    Fehlermeldung Versuch 2: Fehler im SQL_Syntax

    Kann man überhaupt innerhalb einer Where-Klause eine Funktion aufrufen?


  • #2
    Soll die Funktion im WHERE oder im ORDER BY sein? Und ja: beides geht, in SQL. Mir scheint, du hast eine PHP-Funktion...
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Ich möchte im "Order BY" die php-funktion fkt21_Haltedauer aufrufen und dieser den Wert "t10.kdatum" übergeben. aus meiner vorh

      Kommentar


      • #4
        wie soll das gehen, außer die PHP-Funktion läuft im Kontext des DB-Servers? Was natürlich geht, wenn man a) PostgreSQL und b) pl/php hat.
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Zitat von dih Beitrag anzeigen
          Ich habe die folgende Where-Klausel die mir eine bestimmte Sortierung macht, das würde so funktionieren

          ...

          Kann man überhaupt innerhalb einer Where-Klause eine Funktion aufrufen?
          Natürlich kann man innerhalb eines where-clause ein Funktion einsetzen, und zwar - wie bereits geschrieben wurde - auf verschiedene Art und Weise:
          1. Hier wurde es "in PHP" genannt, das muß man differenzieren: Was mit einem Abfrage-Ergebnis passiert, hat natürlich nichts mit SQL zu tun. Und es hat auch mit der Frage nichts zu tun.
          2. Ebenfalls "in PHP" findet die "Komposition" des SQL-Query-Strings, also des Textes, der als SQL-Code an die DB übergeben werden soll, statt. Dazu im Anschluß, auf jeden Fall können dort Funktionen eingesetzt werden, nämlich solche, wie du sie offenbar verwendest.
          3. "In SQL" bzw. "auf der DB" können und werden eigentlich täglich hundertfach Funktionen eingesetzt, dabei handelt es sich aber um "SQL-eigene" Funktionen. Hier sind natürlich die sog. "Aggregatfunktionen" zu nennen, aber um die geht es hier nicht. Es gibt aber Rundungsfunktionen, Datumsfunktionen usw. usf.
          Ich denke, dir geht es um die unter 2.

          Dafür gibt es eine ganz einfache Regel: Wenn du eine Funktion hast, die bspw. dafür sorgen soll, daß anhand von Netto-Preisen, die irgendwo - weiß der Henker wo - her kommen, in einer Tabelle nach den Artikeln mit dem betr., dort gespeicherten Brutto-Preisen gesucht wird, dann kann man das sehr gut auf die Art machen, wie du es getan hast, nur: Das, was dann am Ende auf dem Papier steht, bei dir in $sql_where, bei anderen sofort im fertigen SQL-String, muß, wenn der SQL-String fertig zusammengesetzt ist und du ihn dir z.B. mit var_dump() ausgeben läßt, valider, von deiner Datenbank ausführbarer SQL-Code sein.

          Leider verrätst du uns ja nicht, was deine Funktionen machen, insofern kann man letzteres hier jetzt nicht beurteilen.

          Ein Beispiel:

          Du hast die obige Funktion geschrieben, und die sieht jetzt so aus:
          PHP-Code:
          function fnc_netto_zu_brutto($p_decNetto$p_decUStMulti=1.19) {
            
          $rc=0;

            if (
          $p_decUStMulti 0) {
              if (
          $p_decUStMulti >= 1) {
                
          // bleibt so, nichts tun    
              
          } else {      // dann gehen wir davon aus, daß die 1 vor dem Komma vergessen wurde
                
          $p_decUStMulti $p_decUStMulti;    
              }
            } else {
              
          $p_decUStMulti 1.19;
            }

            
          $rc round($p_decNetto $p_decUStMulti2);

            return 
          $rc;

          Nun baust du sie in deinen SQL-String ein:
          PHP-Code:
          $strSQL 'SELECT EAN, ArtikelBez FROM artikel '.
              
          'WHERE Preis >= '.fnc_netto_zu_brutto(0.900.07).
              
          ' AND Preis <= '.fnc_netto_zu_brutto(20.07);

          var_dump($strSQL); 
          Die Ausgabe lautet:
          Code:
          string(73) "SELECT EAN, ArtikelBez FROM artikel WHERE Preis >= 0.96 AND Preis <= 2.14"
          Also kannst du
          Code:
          SELECT EAN, ArtikelBez FROM artikel WHERE Preis >= 0.96 AND Preis <= 2.14
          z.B. in PHP MyAdmin eingeben und es werden alle Artikel, deren Brutto-Preise zwischen 0,96 und 2,14 EUR liegen, ausgegeben und sie entsprechen demnach deinem Kriterium "Netto zwischen 90 Cent und 2 Euro".

          Kommentar


          • #6
            Das geht nicht.
            PHP-Code:
            $SQL_Where "ORDER BY " fkt21_Haltedauer(`t10`.`kdatum`); 
            Die Funktion ist eine PHP Funiktion und t10.kdatum ist ein Spaltenwert einer SQL Abfrage und ist zum Zeitpunkt der PHP Ausführung nicht bekannt.
            Lösung:
            2 Abfragen

            Was macht die Funktion denn, stell die mal hier rein,

            Oder hast du vorab schon eine Abfrage die du uns nicht zeigst? Alles ein wenig wirr von der Beschreibung her.

            Kommentar


            • #7
              Zitat von protestix Beitrag anzeigen
              Das geht nicht.
              doch, vom Syntax-Müll mal abgesehen ginge das schon ...
              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

              Kommentar


              • #8
                Wie soll das gehen, so wie er das schrieb?

                Kommentar


                • #9
                  Zitat von protestix Beitrag anzeigen
                  Wie soll das gehen, so wie er das schrieb?
                  #4
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    Erst mal vielen Dank für die Antworten. Hier noch mal eine etwas ausführlichere Beschreibung:
                    Der Wert t10.kdatum ist ein Spaltenwert einer SQl-Tabelle. Genau genommen steht hier ein Datumswert drin. Anhand
                    diesem Datums wird die Anzahl der Monate bis zum heutigen Datum mit der folgenden Funktion ermittelt:

                    PHP-Code:
                    function fkt21_Haltedauer($Kaufdatum){

                       
                    $date2 date_create($Kaufdatum);
                       
                    $date1 date_create(date('Y-m-d'));
                       
                    $diff date_diff($date2,$date1);

                       
                    $Haltedauer $diff->days/30.5;  
                       return 
                    ceil($Haltedauer);
                     }
                    }
                    ?> 
                    Es soll also nach der Anzahl der Monate sortiert werden. Ja, ich weiß ich könnte einfach auch nach t10.kdatum sortieren und es käme erst mal das selbe raus...
                    Mir geht es um das generelle Prinzip wie ich in einer Where-Klausel eine Funktion einbinden kann und dabei als Parameter den Namen der SQL-Tabelle übergebe. Wenn das nur mit 2 Abfragen möglich
                    wäre ist das auch ok. Ich finde leider keinen Ansatzpunkt mehr...

                    Hier noch mal ein Versuch:
                    PHP-Code:
                    $SQL_Where "ORDER BY " fkt21_Haltedauer("`t10`.`kdatum`");} 
                    Fehlermeldung: Warning: date_diff() expects parameter 1 to be DateTimeInterface

                    Man erkennt also das der Aufruf der Funktion erst mal klappt, aber ohne den Parameter t10.kdatum

                    Kommentar


                    • #11
                      Wie protestix schon in #6 schreibt, das geht so nicht (#4 dürfte für Dich nicht relevant sein).

                      Du hast 2 Möglichkeiten:
                      - Du baust Dir das direkt im SQL-Statement (Dort gibts auch Datumsfunktionen, z.b. https://www.w3schools.com/sql/func_mysql_datediff.asp)
                      - Du holst alles und sortierst per PHP

                      Ersteres wäre grundsätzlich der bessere Weg.

                      Kommentar


                      • #12
                        Datenbanken haben auch Datumsfunktionen für sowas, Wenn du nach einer Anzahl sortieren willst, dann brauchst du eine Spalte wo du die Anzahl errechnest,und dann gruppierst aber ich denke du hast dich einfach nicht richtig ausgedrückt und meinst ´die Monate als Zahl.

                        Edit sehe gerade ist mehr oder weniger das was Jonas schon geschrieben hat.

                        Kommentar


                        • #13
                          ... hatte was geschrieben, aber dann gelesen, dass es ihm um das Prinzip geht....

                          Kommentar

                          Lädt...
                          X