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.

spyd3rr
źródło
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
Czeski
źródło
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'
Brugolo
źródło
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'
djgupta
źródło