it-swarm.com.de

SQL-LIKE-Bedingung, um auf Ganzzahl zu prüfen?

Ich verwende eine Reihe von SQL-LIKE-Bedingungen, um durch das Alphabet zu gehen und alle Elemente aufzulisten, die mit dem entsprechenden Buchstaben beginnen, z. 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 Buchstaben, aber wie liste ich alle Elemente auf, die mit einer beliebigen Zahl beginnen? Für was es sich lohnt, ist dies auf einer Postgres-DB.

53
Wayne Koorts

Das wählt (durch einen Regex) jedes Buch aus, dessen Titel mit einer Nummer beginnt, ist das, was Sie wollen?

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

wenn Sie Ganzzahlen wünschen, 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 Nummern die gleiche Anzahl von Ziffern haben (eine Einschränkung wäre dann nützlich))

SELECT * FROM books WHERE price BETWEEN 123000 AND 123999;
114
Johannes Weiss

PostgreSQL unterstützt reguläre Ausdrücke, die entsprechen.

So würde dein Beispiel aussehen

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

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

14
Vinko Vrsalovic

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

SELECT * FROM books WHERE price > 89999 AND price < 90100;
1
skensell

Angenommen, Sie suchen nach "Zahlen, die mit 7 beginnen" und nicht nach "Zeichenfolgen, die mit 7 beginnen", vielleicht etwas Ähnliches

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

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

1
Corey Porter

Getestet auf PostgreSQL 9.5:

- nur Ziffern

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

oder,

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

- Beginne mit Ziffer

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

In PostgreSQL können Sie den Operator SIMILAR TO ( more ) verwenden:

-- only digits
select * from books where title similar to '^[0-9]*$';
-- start with digit
select * from books where title similar to '^[0-9]%$';
0

Wenn Sie als Zeichenfolge suchen möchten, können Sie den folgenden Text verwenden:

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

Welches davon ist indexierbar?

Dieser ist definitiv btree-indexierbar:

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

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

0
peufeu