Jak przekonwertować liczbę całkowitą na ciąg jako część zapytania PostgreSQL?


118

Jak przekonwertować liczbę całkowitą na ciąg jako część zapytania PostgreSQL?

Na przykład potrzebuję:

SELECT * FROM table WHERE <some integer> = 'string of numbers'

gdzie <some integer>może mieć od 1 do 15 cyfr.


Co zrobisz, jeśli twój ciąg ma wiodące zera?
thisfeller

Odpowiedzi:


124

Ponieważ liczba może mieć maksymalnie 15 cyfr, musisz rzucić na 64-bitową (8-bajtową) liczbę całkowitą. Spróbuj tego:

SELECT * FROM table
WHERE myint = mytext::int8

::Operator obsada jest historyczny, ale wygodne. Postgres jest również zgodny ze standardową składnią SQL

myint = cast ( mytext as int8)

Jeśli masz dosłowny tekst, z którym chcesz porównać int, rzutuj na inttekst:

SELECT * FROM table
WHERE myint::varchar(255) = mytext

43
Ach. Właściwie potrzebowałem tego na odwrót (myint przekształcił się w varchar), ale Twoja odpowiedź wystarczyła, aby poprowadzić mnie we właściwe miejsce. Właśnie zrobiłem myint::varchar(255) = mytexti działa. Dzięki!
spyd3rr

3
Ściśle rzecz biorąc, to nie odpowiada na pytanie. Przykład nie był problemem - była konwersja liczby całkowitej na znak / łańcuch. Ale dzięki, @ spyd3rr
Frederik Struck-Schøning

@fred Nie tak: rzeczywisty problem OP polegał na nieudanej próbie porównania wartości liczbowych i tekstowych. Ta odpowiedź pokazuje, jak to naprawić, rzutując tekst na liczbę (nawet jeśli OP próbował rzutować liczbę na tekst).
Bohemian

7
@Bohemian Tytuł i tekst pytania brzmi: „Jak przekonwertować liczbę całkowitą na ciąg znaków jako część zapytania PostgreSQL?”. Następnie przykład, kiedy może to mieć znaczenie. W moim przypadku znalazłem ten wątek, ponieważ w rzeczywistości musiałem przekonwertować liczbę całkowitą na ciąg - nie w celu porównania, ale do użycia wewnątrz funkcji agregującej, która zakończyłaby się niepowodzeniem, gdyby argument nie był łańcuchem. W takim przypadku nie była to odpowiedź na pytanie, ponieważ dosłownie brzmi atm.
Frederik Struck-Schøning

126

W ten sposób możesz rzutować liczbę całkowitą na łańcuch

intval::text

i tak w twoim przypadku

SELECT * FROM table WHERE <some integer>::text = 'string of numbers'

1
To nie zadziała, jeśli pracujesz z SpEL w zapytaniach natywnych jpa. W takim przypadku będziesz musiał użyć odlewu.
Raj Shah

12

Możesz to zrobić:

SELECT * FROM table WHERE cast(YOUR_INTEGER_VALUE as varchar) = 'string of numbers'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.