Reguläre Ausdrücke in Base Abfragen

Servus zusammen,

ich komm grad nicht drauf, wie man reguläre Ausdrücke in
Filterbedingungen in Base nutzen kann. Ich habe versucht

  … WHERE column RLIKE 'regex_here'
  … WHERE column REGEXP 'regex_here'
  … WHERE column REGEXP_LIKE 'regex_here'

Aber nichts davon funktioniert.

Konkret möchte ich alle Werte finden, die mit sechs Ziffern beginnen,
d.h. also mein Ausdruck wäre etwas wie

  '^[0-9]{6}.*$'

Kann mir jemand einen Tip geben?

Danke+Gruß!

Hallo Andre,

ich arbeite (über Perl) zwar häufig mit "Regulären Ausdrücken"
und kann Dir deshalb auch aus Erfahrung sagen das

    .*$
(irgendwas) punkt stern zeilenende

zwar Probleme bereiten, aber warum, dass weiss ich selbst nur so
ungefähr und müsste es erst nachlesen.

Über

http://www.regexe.de/

habe ich ein paar Tests gefahren und kann Dir vielleicht folgenden
Ausdruck anbieten:

^[0-9]{6}.{0,}

zeilenanfang [ziffern] {exakt 6} punkt_fuer_irgendwas {0 zeichen
bis zeilenende}

Gruß Achim

Hallo Andre,

ich komm grad nicht drauf, wie man reguläre Ausdrücke in
Filterbedingungen in Base nutzen kann. Ich habe versucht

  … WHERE column RLIKE 'regex_here'
  … WHERE column REGEXP 'regex_here'
  … WHERE column REGEXP_LIKE 'regex_here'

Ich habe die Befürchtung, dass Du mit Deinem Vorhaben kein Glück haben
wirst, zumindest wenn Du die interne HSQLDB benutzt. Die kennt nur LIKE
und dort dann auch nur Platzhalter für ein oder beliebig viele Zeichen:

The LIKE keyword uses '%' to match any (including 0) number of
characters, and '_' to match exactly one character. To search for '%' or
'_' itself an escape character must also be specified using the ESCAPE
clause. For example, if the backslash is the escaping character, '\%'
and '\_' can be used to find the '%' and '_' characters themselves. For
example, SELECT .... LIKE '\_%' ESCAPE '\' will find the strings
beginning with an underscore.

Wenn Du z.B. MySQL nutzt geht REGEXP bzw. RLIKE mit den von Dir
aufgeführten Parametern.

Gruß

Robert

Standard Keyword wäre LIKE_REGEX - aber k.A. ob hsqldb das unterstützt.

Was aber in der Doku aufgeführt wird ist REGEXP_MATCHES,
REGEXP_SUBSTRING und REGEXP_SUBSTRING_ARRAY

http://hsqldb.org/doc/guide/builtinfunctions-chapt.html#bfc_string_binary_functions

ciao
Christian

Hallo Christian,

Standard Keyword wäre LIKE_REGEX - aber k.A. ob hsqldb das unterstützt.

Was aber in der Doku aufgeführt wird ist REGEXP_MATCHES,
REGEXP_SUBSTRING und REGEXP_SUBSTRING_ARRAY

http://hsqldb.org/doc/guide/builtinfunctions-chapt.html#bfc_string_binary_functions

Diese Dokumentation ist leider für die 2.2 der HSQLDB. Und die interne
von LibreOffice ist die 1.8.* Die Dokumentation hierzu ist irgendwann im
letzten Monat vom Server genommen worden - meine Links zeigen dazu nur
noch Error 404 an. Ich habe allerdings den kompletten Inhalt hier auf
Platte. Und da gibt es keine REGEXP-Funktionen.

Gruß

Robert

Hallo Christian,

Standard Keyword wäre LIKE_REGEX - aber k.A. ob hsqldb das unterstützt.

Was aber in der Doku aufgeführt wird ist REGEXP_MATCHES,
REGEXP_SUBSTRING und REGEXP_SUBSTRING_ARRAY

http://hsqldb.org/doc/guide/builtinfunctions-chapt.html#bfc_string_binary_functions

Diese Dokumentation ist leider für die 2.2 der HSQLDB. Und die interne
von LibreOffice ist die 1.8.* Die Dokumentation hierzu ist irgendwann im
letzten Monat vom Server genommen worden - meine Links zeigen dazu nur
noch Error 404 an. Ich habe allerdings den kompletten Inhalt hier auf
Platte. Und da gibt es keine REGEXP-Funktionen.

Gruß

Robert

Konkret möchte ich alle Werte finden, die mit sechs Ziffern beginnen,
d.h. also mein Ausdruck wäre etwas wie

'^[0-9]{6}.*$'

Hi - ist zwar nicht das was man einen regulären Ausdruck nennt, aber für die meisten Daten wird's passen.

Wenn Du Dir sicher bist, dass es keine Einträge gibt, die 1Z3456 heißen, dann kannst Du einfach die 'LEFT' Funktion benutzen:

SELECT LEFT( "TextFeld", 6 ) AS "Stellen 1 bis 6",
        ( CONVERT ( LEFT( "TextFeld", 6 ) , BIGINT ) ) * 3 AS "Konvertiert und Plutimikation"
FROM "Tabelle1"
WHERE LEFT( "TextFeld", 6 ) >= '0'
   AND LEFT( "TextFeld", 6 ) <= '999999'

sonst musst Du jede Stelle einzeln abfragen:

SELECT LEFT( "TextFeld", 6 ) AS "Stellen 1 bis 6",
        (CONVERT(LEFT("TextFeld",6),BIGINT)) * 3 AS "Konvertiert und Plutimikation"
FROM "Tabelle1"
WHERE SUBSTRING ( "TextFeld", 1, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 1, 1 ) <= '9'
   AND SUBSTRING ( "TextFeld", 2, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 2, 1 ) <= '9'
   AND SUBSTRING ( "TextFeld", 3, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 3, 1 ) <= '9'
   AND SUBSTRING ( "TextFeld", 4, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 4, 1 ) <= '9'
   AND SUBSTRING ( "TextFeld", 5, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 5, 1 ) <= '9'
   AND SUBSTRING ( "TextFeld", 6, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 6, 1 ) <= '9'

Über die Convert-Funktion kannst Du prüfen ob Deine Abfrage stimmt -
sollte eine Exception kommen, dann weil ein Buchstabe oder Sonder-
zeichen nicht in einen Numerischen Wert umgewandelt werden kann.

Hallo liebe Liste,

Anfrage:

Konkret möchte ich alle Werte finden, die mit sechs Ziffern beginnen,
d.h. also mein Ausdruck wäre etwas wie

'^[0-9]{6}.*$'

Kann mir jemand freundlicherweise kurz erklären, um was es sich bei vorsteh. Hieroglyphen
handelt und wozu diese für den Normal-Anwender von LO nütze sind?

Hi - ist zwar nicht das was man einen regulären Ausdruck nennt, aber für die meisten Daten wird's passen.

Wenn Du Dir sicher bist, dass es keine Einträge gibt, die 1Z3456 heißen, dann kannst Du einfach die 'LEFT' Funktion benutzen:

SELECT LEFT( "TextFeld", 6 ) AS "Stellen 1 bis 6",
       ( CONVERT ( LEFT( "TextFeld", 6 ) , BIGINT ) ) * 3 AS "Konvertiert und Plutimikation"
FROM "Tabelle1"
WHERE LEFT( "TextFeld", 6 ) >= '0'
  AND LEFT( "TextFeld", 6 ) <= '999999'

sonst musst Du jede Stelle einzeln abfragen:

SELECT LEFT( "TextFeld", 6 ) AS "Stellen 1 bis 6",
       (CONVERT(LEFT("TextFeld",6),BIGINT)) * 3 AS "Konvertiert und Plutimikation"
FROM "Tabelle1"
WHERE SUBSTRING ( "TextFeld", 1, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 1, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 2, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 2, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 3, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 3, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 4, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 4, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 5, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 5, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 6, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 6, 1 ) <= '9'

und wozu braucht man diese vorsteh. Kenntnisse? In welchen EDV-Sprachbereich gehören sie?

Über die Convert-Funktion kannst Du prüfen ob Deine Abfrage stimmt -
sollte eine Exception kommen, dann weil ein Buchstabe oder Sonder-
zeichen nicht in einen Numerischen Wert umgewandelt werden kann.

Danke und mit freundlichem Gruß !
              JoLa

Hallo liebe Liste,

Anfrage:

Konkret möchte ich alle Werte finden, die mit sechs Ziffern beginnen,
d.h. also mein Ausdruck wäre etwas wie

'^[0-9]{6}.*$'

Kann mir jemand freundlicherweise kurz erklären, um was es sich bei vorsteh. Hieroglyphen
handelt und wozu diese für den Normal-Anwender von LO nütze sind?

Hi - ist zwar nicht das was man einen regulären Ausdruck nennt, aber für die meisten Daten wird's passen.

Wenn Du Dir sicher bist, dass es keine Einträge gibt, die 1Z3456 heißen, dann kannst Du einfach die 'LEFT' Funktion benutzen:

SELECT LEFT( "TextFeld", 6 ) AS "Stellen 1 bis 6",
       ( CONVERT ( LEFT( "TextFeld", 6 ) , BIGINT ) ) * 3 AS "Konvertiert und Plutimikation"
FROM "Tabelle1"
WHERE LEFT( "TextFeld", 6 ) >= '0'
  AND LEFT( "TextFeld", 6 ) <= '999999'

sonst musst Du jede Stelle einzeln abfragen:

SELECT LEFT( "TextFeld", 6 ) AS "Stellen 1 bis 6",
       (CONVERT(LEFT("TextFeld",6),BIGINT)) * 3 AS "Konvertiert und Plutimikation"
FROM "Tabelle1"
WHERE SUBSTRING ( "TextFeld", 1, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 1, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 2, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 2, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 3, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 3, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 4, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 4, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 5, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 5, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 6, 1 ) >= '0' AND SUBSTRING ( "TextFeld", 6, 1 ) <= '9'

und wozu braucht man diese vorsteh. Kenntnisse? Aus welchem EDV-Sprachbereich sind sie?

Über die Convert-Funktion kannst Du prüfen ob Deine Abfrage stimmt -
sollte eine Exception kommen, dann weil ein Buchstabe oder Sonder-
zeichen nicht in einen Numerischen Wert umgewandelt werden kann.

Danke und mit freundlichem Gruß !
              JoLa

Hallo liebe Liste,

Anfrage:

Konkret möchte ich alle Werte finden, die mit sechs Ziffern beginnen,
d.h. also mein Ausdruck wäre etwas wie

'^[0-9]{6}.*$'

Kann mir jemand freundlicherweise kurz erklären, um was es sich bei vorsteh. Hieroglyphen
handelt und wozu diese für den Normal-Anwender von LO nütze sind?

Hi - ist zwar nicht das was man einen regulären Ausdruck nennt, aber
für die meisten Daten wird's passen.

Wenn Du Dir sicher bist, dass es keine Einträge gibt, die 1Z3456
heißen, dann kannst Du einfach die 'LEFT' Funktion benutzen:

SELECT LEFT( "TextFeld", 6 ) AS "Stellen 1 bis 6",
       ( CONVERT ( LEFT( "TextFeld", 6 ) , BIGINT ) ) * 3 AS
"Konvertiert und Plutimikation"
FROM "Tabelle1"
WHERE LEFT( "TextFeld", 6 ) >= '0'
  AND LEFT( "TextFeld", 6 ) <= '999999'

sonst musst Du jede Stelle einzeln abfragen:

SELECT LEFT( "TextFeld", 6 ) AS "Stellen 1 bis 6",
       (CONVERT(LEFT("TextFeld",6),BIGINT)) * 3 AS "Konvertiert und
Plutimikation"
FROM "Tabelle1"
WHERE SUBSTRING ( "TextFeld", 1, 1 ) >= '0' AND SUBSTRING (
"TextFeld", 1, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 2, 1 ) >= '0' AND SUBSTRING (
"TextFeld", 2, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 3, 1 ) >= '0' AND SUBSTRING (
"TextFeld", 3, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 4, 1 ) >= '0' AND SUBSTRING (
"TextFeld", 4, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 5, 1 ) >= '0' AND SUBSTRING (
"TextFeld", 5, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 6, 1 ) >= '0' AND SUBSTRING (
"TextFeld", 6, 1 ) <= '9'

und wozu braucht man diese vorsteh. Kenntnisse? Aus welchem EDV-Sprachbereich sind sie?

Über die Convert-Funktion kannst Du prüfen ob Deine Abfrage stimmt -
sollte eine Exception kommen, dann weil ein Buchstabe oder Sonder-
zeichen nicht in einen Numerischen Wert umgewandelt werden kann.

Danke und mit freundlichem Gruß !
              JoLa

Moin Jost,

>>> '^[0-9]{6}.*$'

Kann mir jemand freundlicherweise kurz erklären, um was es sich bei
vorsteh. Hieroglyphen
handelt und wozu diese für den Normal-Anwender von LO nütze sind?

Es geht hier um reguläre Ausdrücke[1], mit denen man Mengen von Zeichenketten
beschreiben kann.

Verwenden kann man sie zum Filtern, beim Suchen und Ersetzen, aber auch zur
Überprüfung von Zeichenketten bei Benutzer-Eingaben in Felder (etwa ob eine E-
Mail-Adresse syntaktisch korrekt eingegeben wurde).

Du kennst sicher die "Wildcards" aus DOS (wie z.B. den Stern im berühmten
Kommando 'del *.*'). Damit werden ja auch Mengen von Zeichenketten
beschrieben, mit regulären Ausdrücken kann man aber viel differnzierter
vorgehen als mit Wildcards.

> SELECT LEFT ...
> FROM ...
> WHERE ...

und wozu braucht man diese vorsteh. Kenntnisse? Aus welchem
EDV-Sprachbereich sind sie?

Das ist eine Datenbankabfrage (SQL). (Aber eben ein Beispiel OHNE regulären
Ausdruck).

Gruß Nino

[1] http://de.wikipedia.org/wiki/Regulärer_Ausdruck

Hallo Jost Lange,

Konkret möchte ich alle Werte finden, die mit sechs Ziffern beginnen,
d.h. also mein Ausdruck wäre etwas wie

'^[0-9]{6}.*$'

Kann mir jemand freundlicherweise kurz erklären, um was es sich bei
vorsteh. Hieroglyphen
handelt und wozu diese für den Normal-Anwender von LO nütze sind?

Das ist ein sogenannter Regulärer Ausdruck (Regular Expression), eine
bestimmte Art und Weise Suchmuster zu definieren.
http://de.wikipedia.org/wiki/Regex

Wenn Du Dir sicher bist, dass es keine Einträge gibt, die 1Z3456
heißen, dann kannst Du einfach die 'LEFT' Funktion benutzen:

SELECT LEFT( "TextFeld", 6 ) AS "Stellen 1 bis 6",
       ( CONVERT ( LEFT( "TextFeld", 6 ) , BIGINT ) ) * 3 AS
"Konvertiert und Plutimikation"
FROM "Tabelle1"
WHERE LEFT( "TextFeld", 6 ) >= '0'
  AND LEFT( "TextFeld", 6 ) <= '999999'

sonst musst Du jede Stelle einzeln abfragen:

SELECT LEFT( "TextFeld", 6 ) AS "Stellen 1 bis 6",
       (CONVERT(LEFT("TextFeld",6),BIGINT)) * 3 AS "Konvertiert und
Plutimikation"
FROM "Tabelle1"
WHERE SUBSTRING ( "TextFeld", 1, 1 ) >= '0' AND SUBSTRING (
"TextFeld", 1, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 2, 1 ) >= '0' AND SUBSTRING (
"TextFeld", 2, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 3, 1 ) >= '0' AND SUBSTRING (
"TextFeld", 3, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 4, 1 ) >= '0' AND SUBSTRING (
"TextFeld", 4, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 5, 1 ) >= '0' AND SUBSTRING (
"TextFeld", 5, 1 ) <= '9'
  AND SUBSTRING ( "TextFeld", 6, 1 ) >= '0' AND SUBSTRING (
"TextFeld", 6, 1 ) <= '9'

und wozu braucht man diese vorsteh. Kenntnisse? Aus welchem
EDV-Sprachbereich sind sie?

Das sind Befehle der Programmiersprache Basic (hier speziell
LibreOffice Basic).

- --
Mit freundlichem Gruß
GwenDragon
E-Mail: gd@gwendragon.de
Website: http://gwendragon.de
Blog: http://gwendragon.de/blog/

- -----------------------------------------------------------------
E-Mail mit GnuPG signiert/Signed with GnuPG

GnuPG-Signatur DSA/1024
Key-ID: 0x6E56AC7D4492AD16
Fingerprint: 0BC8 DDF7 E381 190B AF7D A327 6E56 AC7D 4492 AD16
- -----------------------------------------------------------------

Hi,
  wenn hier schon nach den Grundlagen der Informatik gefragt wird, dann wollen mal auch die Antworten exakt machen. :wink:

Konkret möchte ich alle Werte finden, die mit sechs Ziffern beginnen,
d.h. also mein Ausdruck wäre etwas wie

'^[0-9]{6}.*$'

Kann mir jemand freundlicherweise kurz erklären, um was es sich bei
vorsteh. Hieroglyphen
handelt und wozu diese für den Normal-Anwender von LO nütze sind?

Das ist ein sogenannter Regulärer Ausdruck (Regular Expression), eine
bestimmte Art und Weise Suchmuster zu definieren.
http://de.wikipedia.org/wiki/Regex

Ein regulärer Ausdruck beschreibt eine Teilmenge der Menge aller Worte, die aus einem Alphabet ( Zeichenvorrat, z.B. ASCII-Zeichen ) gebildet werden können. Da interessierende Textpassagen üblicherweise genau so etwas sind ( Teilmenge aller möglichen Kombinationen von Zeichen ), kann man regex als Suchmuster benutzen.
Die Schlüsselworte in Programmiersprachen werden aber z.B. auch per Regex definiert.

Wenn Du Dir sicher bist, dass es keine Einträge gibt, die 1Z3456
heißen, dann kannst Du einfach die 'LEFT' Funktion benutzen:

SELECT LEFT( "TextFeld", 6 ) AS "Stellen 1 bis 6",
        ( CONVERT ( LEFT( "TextFeld", 6 ) , BIGINT ) ) * 3 AS
"Konvertiert und Plutimikation"
FROM "Tabelle1"
WHERE LEFT( "TextFeld", 6 )>= '0'
   AND LEFT( "TextFeld", 6 )<= '999999'

sonst musst Du jede Stelle einzeln abfragen:

SELECT LEFT( "TextFeld", 6 ) AS "Stellen 1 bis 6",
        (CONVERT(LEFT("TextFeld",6),BIGINT)) * 3 AS "Konvertiert und
Plutimikation"
FROM "Tabelle1"
WHERE SUBSTRING ( "TextFeld", 1, 1 )>= '0' AND SUBSTRING (
"TextFeld", 1, 1 )<= '9'
   AND SUBSTRING ( "TextFeld", 2, 1 )>= '0' AND SUBSTRING (
"TextFeld", 2, 1 )<= '9'
   AND SUBSTRING ( "TextFeld", 3, 1 )>= '0' AND SUBSTRING (
"TextFeld", 3, 1 )<= '9'
   AND SUBSTRING ( "TextFeld", 4, 1 )>= '0' AND SUBSTRING (
"TextFeld", 4, 1 )<= '9'
   AND SUBSTRING ( "TextFeld", 5, 1 )>= '0' AND SUBSTRING (
"TextFeld", 5, 1 )<= '9'
   AND SUBSTRING ( "TextFeld", 6, 1 )>= '0' AND SUBSTRING (
"TextFeld", 6, 1 )<= '9'

und wozu braucht man diese vorsteh. Kenntnisse? Aus welchem
EDV-Sprachbereich sind sie?

Das sind Befehle der Programmiersprache Basic (hier speziell
LibreOffice Basic).

Hier handelt es sich um SQL-Ausdrücke zur Abfrage einer Datenbank. Libreoffice Basic enthält dies als eine Teilmenge der Sprache.

Gruss
Bernhard

Hallo Bernhard,

wird, dann wollen mal auch die Antworten exakt machen. :wink:
... eine Teilmenge der Menge aller Worte
die aus einem Alphabet ( Zeichenvorrat, z.B. ASCII-Zeichen

"exakt" <<< das tut dann aber weh !