SQL LIKE Bedingung zur Überprüfung auf Ganzzahl?

80

Ich verwende eine Reihe von SQL LIKE-Bedingungen, um das Alphabet durchzugehen und alle Elemente aufzulisten, die mit dem entsprechenden Buchstaben beginnen, z. B. um alle Bücher zu erhalten, deren Titel mit dem Buchstaben "A" beginnt:

SELECT * FROM books WHERE title ILIKE "A%"

Das ist gut für Briefe, aber wie liste ich alle Elemente auf, die mit einer beliebigen Nummer beginnen? Für das, was es wert ist, ist dies auf einer Postgres-Datenbank.

Wayne Koorts
quelle

Antworten:

154

Das wählt (durch einen regulären Ausdruck) jedes Buch aus, dessen Titel mit einer Zahl beginnt. Ist es das, was Sie wollen?

SELECT * FROM books WHERE title ~ '^[0-9]'

Wenn Sie Ganzzahlen möchten, die mit bestimmten Ziffern beginnen, können Sie Folgendes verwenden:

SELECT * FROM books WHERE CAST(price AS TEXT) LIKE '123%'

oder verwenden (wenn alle Ihre Zahlen die gleiche Anzahl von Ziffern haben (eine Einschränkung wäre dann nützlich))

SELECT * FROM books WHERE price BETWEEN 123000 AND 123999;
Johannes Weiss
quelle
1
Beim Versuch von op2 erhalte ich die Meldung "Explizite Konvertierung vom Datentyp int in Text ist nicht zulässig."
Gilad
1
Wenn Option 2 den im obigen Kommentar erwähnten expliziten Konvertierungsfehler zurückgibt (der in SQL Server und möglicherweise anderen Programmen auftreten kann), versuchen Sie, VARCHAR mit einer maximalen Größe zu verwenden: SELECT * FROM books WHERE CAST (Preis AS VARCHAR (20)) WIE '% 123%'
bstrong
Vielen Dank! Ich kann 5 Penny hinzufügen: Sie können auch verwenden: [...] CAST (Preis ALS TEXT) ~ * '123%' mit dem Operator ~ *. Sie können dann auch beliebige reguläre Ausdrücke verwenden, wie: [...] CAST (Preis ALS TEXT) ~ * '^ 123 \ -? 456 $'
Arsenii
18

PostgreSQL unterstützt den Abgleich regulärer Ausdrücke .

Ihr Beispiel würde also so aussehen

SELECT * FROM books WHERE title ~ '^\d+ ?' 

Dies entspricht einem Titel, der mit einer oder mehreren Ziffern und einem optionalen Leerzeichen beginnt

Vinko Vrsalovic
quelle
5

Wenn Sie als Zeichenfolge suchen möchten, können Sie Text wie folgt umwandeln:

SELECT * FROM books WHERE price::TEXT LIKE '123%'
gellezzz
quelle
2

Ich bin zu spät zur Party hier, aber wenn Sie es mit Ganzzahlen fester Länge zu tun haben, können Sie einfach einen Ganzzahlvergleich durchführen:

SELECT * FROM books WHERE price > 89999 AND price < 90100;
Skensell
quelle
2

Getestet auf PostgreSQL 9.5:

- nur Ziffern

select * from books where title ~ '^[0-9]*$';

oder,

select * from books where title SIMILAR TO '[0-9]*';

- Beginnen Sie mit der Ziffer

select * from books where title ~ '^[0-9]+';
Charlie 木匠
quelle
1

Angenommen, Sie suchen nach "Zahlen, die mit 7 beginnen" anstatt nach "Zeichenfolgen, die mit 7 beginnen", vielleicht so etwas

select * from books where convert(char(32), book_id) like '7%'

Oder was auch immer das Postgres-Äquivalent von konvertieren ist.

Corey Porter
quelle
0

Welches davon ist indexierbar?

Dieser ist definitiv btree-indexierbar:

WHERE title >= '0' AND title < ':'

Beachten Sie, dass ':' in ASCII nach '9' steht.

Bobflux
quelle
0

In PostreSQL können Sie den SIMILAR TO- Operator ( mehr ) verwenden:

-- only digits
select * from books where title similar to '^[0-9]*$';
-- start with digit
select * from books where title similar to '^[0-9]%$';
Máťa - Stitod.cz
quelle
1
nur Ziffern: wobei Titel ~ '^ [0-9] * $';
Charlie 18
Scheint, dass SIMILAR TO in PostgreSQL 9.5 nicht mit "^" arbeitet. POSIX Regular Expressions "~" funktioniert.
Charlie 18