Di PostgreSQL saya memiliki tabel dengan kolom varchar. Data seharusnya berupa bilangan bulat dan saya membutuhkannya dalam tipe bilangan bulat dalam kueri. Beberapa nilai adalah string kosong. Pengikut:
SELECT myfield::integer FROM mytable
hasil panen ERROR: invalid input syntax for integer: ""
Bagaimana saya bisa meminta para pemain dan memiliki 0 jika terjadi kesalahan selama para pemain di postgres?
sumber
E'\\d{1,5}$'
.{1,5}
atas pada digit mungkin adalah ide yang bagus jika Anda khawatir tentang melimpah, tetapi akan menutupi angka yang lebih besar, yang dapat menyebabkan masalah jika Anda mengonversi tabel. Secara pribadi saya lebih suka memiliki kesalahan permintaan di muka dan tahu bahwa beberapa "integer" saya edan (Anda juga dapat memilih dengan yangE'\\d{6,}$'
pertama untuk memastikan).Anda juga dapat membuat fungsi konversi Anda sendiri, di dalamnya Anda dapat menggunakan blok pengecualian:
Pengujian:
sumber
INSERT
pernyataan?Saya mempunyai kebutuhan yang sama dan merasa ini bekerja dengan baik untuk saya (postgres 8.4):
Beberapa kasus uji untuk menunjukkan:
Jika Anda perlu menangani kemungkinan bidang memiliki teks non-numerik (seperti "100bad"), Anda dapat menggunakan regexp_replace untuk menghapus karakter non-numerik sebelum pemeran.
Kemudian nilai teks / varchar seperti "b3ad5" juga akan memberikan angka
Untuk mengatasi kekhawatiran Chris Cogdon dengan solusi tidak memberikan 0 untuk semua kasus, termasuk kasus seperti "buruk" (tidak ada karakter digit sama sekali), saya membuat pernyataan yang disesuaikan ini:
Ini berfungsi mirip dengan solusi yang lebih sederhana, kecuali akan memberikan 0 ketika nilai untuk dikonversi adalah karakter non-digit saja, seperti "buruk":
sumber
Ini mungkin semacam peretasan, tapi itu menyelesaikan pekerjaan dalam kasus kami:
Penjelasan (Diuji pada Postgres 8.4):
Ekspresi yang disebutkan di atas menghasilkan
NULL
untuk nilai-nilai NULL dimyfield
dan0
untuk string kosong (Perilaku tepat ini mungkin cocok atau tidak cocok dengan kasus penggunaan Anda).Data uji:
Kueri akan menghasilkan hasil berikut:
Sedangkan pilih saja
values::integer
akan menghasilkan pesan kesalahan.Semoga ini membantu.
sumber
SELECT CASE WHEN myfield="" THEN 0 ELSE myfield::integer END FROM mytable
Saya belum pernah bekerja dengan PostgreSQL tapi saya memeriksa manual untuk sintaks yang benar dari pernyataan IF dalam permintaan SELECT.
sumber
@ Jawaban Matthew bagus. Tetapi bisa lebih sederhana dan lebih cepat. Dan pertanyaannya meminta untuk mengonversi string kosong (
''
) menjadi0
, tetapi bukan input "sintaks input tidak valid" atau "di luar kisaran" lainnya:Ini mengembalikan
0
string kosong danNULL
input tidak valid lainnya.Itu dapat dengan mudah diadaptasi untuk konversi tipe data apa pun .
Memasuki blok pengecualian jauh lebih mahal. Jika string kosong adalah umum , masuk akal untuk menangkap kasus itu sebelum mengajukan pengecualian.
Jika string kosong sangat jarang, ia membayar untuk memindahkan tes ke klausa pengecualian.
sumber
Fungsi ini akan selalu kembali
0
jika tidak ada digit dalam string input.SELECT parse_int('test12_3test');
akan kembali
123
sumber
Saya menemukan kode berikut ini mudah dan berfungsi. Jawaban asli ada di sini https://www.postgresql.org/message-id/[email protected]
semoga membantu
sumber
SUBSTRING dapat membantu untuk beberapa kasus, Anda dapat membatasi ukuran int.
sumber
Jika data seharusnya berupa bilangan bulat, dan Anda hanya perlu nilai-nilai itu sebagai bilangan bulat, mengapa Anda tidak melakukan yang terbaik dan mengonversi kolom menjadi kolom bilangan bulat?
Kemudian Anda bisa melakukan konversi nilai ilegal ini menjadi nol hanya sekali, pada titik sistem di mana data dimasukkan ke dalam tabel.
Dengan konversi di atas, Anda memaksa Postgres untuk mengonversi nilai-nilai itu lagi dan lagi untuk setiap baris di setiap kueri untuk tabel itu - ini secara serius dapat menurunkan kinerja jika Anda melakukan banyak pertanyaan terhadap kolom ini dalam tabel ini.
sumber
Fungsi berikut tidak
error_result
) untuk hasil yang tidak dapat dicasting misalnyaabc
atau999999999999999999999999999999999999999999
null
sebagainull
bigints
dibandingkanlower_bound
dengan misalnya hanya menegakkan nilai-nilai positifsumber
Saya juga memiliki kebutuhan yang sama tetapi bekerja dengan JPA 2.0 dan Hibernate 5.0.2:
Keajaiban bekerja. Saya pikir itu bekerja dengan LIKE juga.
sumber
Ini juga harus melakukan pekerjaan tetapi ini di SQL dan tidak spesifik postgres.
sumber