Announcement

Collapse
No announcement yet.

SQL Like

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL Like

    Hallo

    Könnte jemand ein kleines Beispiel posten, wie ich das LIKE bei SQL benutze. Mein Problem ist: Ich habe eine Datenbank mit einer Datumsspalte. Ich möchte nun überprüfen, ob ein Datensatz in einem bestimmten Zeitraum liegt. Dieser Zeitraum hängt aber nur von Monat und Jahr ab.

    Ich habe es so versucht:
    db:TQuery;

    db:=TQuery.Create(Form1);
    db.Close;
    db.SQL.Clear;
    db.SQL.Add('SELECT * FROM "C:\test.db" WHERE DATUM LIKE "%.05.2001"');
    db.Open;

    Der Fehler ist: Keine Übereinstimmung bei den Typen im Ausdruck.

    MfG
    Silver

  • #2
    Hallo,

    die folgende LOCAL SQL-Abfrage greift auf die Delphi-Beispieldatenbank DBDEMOS zu:
    <pre>
    SELECT SaleDate,
    CAST(SaleDate AS CHAR(10)) AS DatumString,
    SUBSTRING(CAST(SaleDate AS VARCHAR(10)) FROM 4 FOR 7) AS DatumSubString
    FROM Orders.db
    WHERE SUBSTRING(CAST(SaleDate AS CHAR(10)) FROM 4 FOR 7) = '05.1988'
    </pre>
    Wenn man auf ein Datumsfeld mit LIKE oder einem Stringvergleich zugreifen will, muss der numerische Datumswert zuerst über CAST in einen VARCHAR-Wert konvertiert werden. Anstelle von LIKE ist das Kopieren eines Teilstrings über SUBSTRING effektiver

    Comment


    • #3
      Danke das bringt mich schon ein bißchen weiter.
      Eine Frage habe ich aber noch. Was muss ich ändern, damit nur das Jahr berücksichtigt wird. Dadurch wird mir der ganze Befehl hoffentlich klarer.

      MfG
      Silve

      Comment


      • #4
        Hi,

        <pre>
        Select * from "C:\Test.db"
        where Substr(Cast(Datum As Char(10)) from 8 for 4 ) = '1998'
        </pre>

        Gruß
        Gesin

        Comment


        • #5
          Hi

          Hat vielleicht jemand eine Idee wie ich diese Abfrage geschickt umgestalte, so das er alle Datensätze heraussucht die zwar im selben Jahr liegen müssen aber auch in den Vormonaten liegen können.
          Beispiel: Ich suche nach Mai im Jahr 1998. Er soll mir nicht nur Mai ausgeben, sondern auch April, März, Februar und Januar.

          Im Moment mache ich das mit OR in der WHERE-Klausel.

          Gibt es da eine Möglichkeit, das noch geschickter zu machen

          MfG
          Silve

          Comment


          • #6
            Hallo,

            normalerweise ist LIKE nur für die Abfrage von Zeichenketten vorgesehen, aber <b>nicht</b> für das Beschränken der Ergebnismenge basierend auf Datumswerten. Daher muss man zur Typumwandlung über CAST sowie zum Zeichenketten-Operator SUBSTRING greifen, um "Äpfel" mit "Birnen" vergleichen zu können.

            Wenn eine Bereichs-Suche nach Datumswerten benötigt wird, ist LIKE nur ein Kompromiss. Statt dessen würde ich mit <b>&lt;</b> und <b>&gt;</b> arbeiten:
            <pre>
            SELECT * FROM Orders.db
            WHERE SaleDate > '01.01.1988'
            AND SaleDate < '01.06.1988'
            </pre&gt

            Comment


            • #7
              Die SQL Abfrage hat mir das Leben zwar schon erleichtert, allerdings bin ich schon kurze Zeit später auf das nächste Problem gestoßen.
              Ich ziehe bestimmte Daten aus einer Paradox Tabelle und verwende die Suchergebnisse als Sortierkriterien um Daten, mittels einer weiteren SQL-Abfrage, aus einer anderen Paradox Tabelle zu erhalten. Für sämtliche Abfragen habe ich bisher die TQuery-Komponente verwendet. Aber nach einer gewissen Zeit taucht immer wieder der Fehler "Zu viele Dateien geöffnet" auf. Es wird vorgeschlagen den Wert von MAX_FILE_HANDLE zu erhöhen um dieses Problem zu beheben. Da ich hierzu nichts brauchbares finden konnte, wollte ich den Zugriff mal über ADO versuchen. Ich konnte auch alle Abfragen auf ADO umstellen, so das ich wie voher auf meine Paradox Tabellen zugreifen kann. Nur die SQL-Abfrage:
              SELECT * FROM Order WHERE RECH_DAT > '01.01.1988' AND RECH_DAT < '01.05.1988' bekomme ich nicht hin. Die Fehlermeldung lautet:
              "Datentypen in Kriterienausdruck unverträglich"

              Ich verwende folgenden ConnectionString:
              'Provider=MSDASQL.1;Persist Security Info=False;Data Source=dBASE-Dateien;Initial Catalog='C:\test';

              In dem Verzeichnis C:\Test befinden sich meine Paradox Tabellen.

              Muss ich diese Felder voher wieder CASTEN und wenn ja wie?

              MfG
              Silve

              Comment


              • #8
                Hallo,

                hinter dem Provider MSDASQL verbirgt sich der <i>Microsoft OLE DB Provider for ODBC Driver</i>, der über die ODBC-DSN <i>dBASE-Dateien</i> und somit über einen ODBC-Treiber auf die Paradox-Tabellen zugreift. Somit bestimmt der verwendete ODBC-Treiber die erwartete Syntax.

                P.S: Generell ist es keine gute Idee, für den Zugriff auf Paradox-Datenbanken zu ADO zu greifen. Die einzige Ausnahme von dieser Regel betrifft Import- und Export-Funktionen

                Comment

                Working...
                X