Di PostgreSQL, Anda dapat menggunakan to_number()
berfungsi untuk mengubah string menjadi nilai numerik.
Lebih khusus lagi, ini mengubah representasi string dari angka menjadi nilai numerik.
Misalnya, jika Anda memiliki $1,234.50
sebagai string, Anda dapat menggunakan to_number()
untuk mengonversinya menjadi angka sebenarnya yang menggunakan numerik tipe data.
Sintaks
Sintaksnya seperti ini:
to_number(text, text)
Dimana argumen pertama adalah representasi string dari angka, dan argumen kedua mendefinisikan template yang digunakan argumen pertama.
Contoh
Berikut adalah contoh dasar untuk didemonstrasikan.
SELECT to_number('80', '99');
Hasil:
80
Dalam hal ini, saya menggunakan 99
sebagai templat. Setiap 9
disebut sebagai "pola template". 9
pola template mewakili posisi digit. Saya menggunakan dua, karena saya ingin kedua digit disertakan.
Inilah yang terjadi jika saya menghapus salah satu 9
s.
SELECT to_number('80', '9');
Hasil:
8
Jadi, penting untuk menyertakan jumlah pola template yang benar dalam template.
Pemisah Grup dan Titik Desimal
Saat bekerja dengan angka yang lebih besar dan/atau angka dengan pecahan detik, Anda harus menyertakan pola template yang menentukan pemisah grup dan/atau titik desimal.
Ada dua cara untuk melakukannya.
Opsi pertama adalah mengetik koma dan titik desimal secara harfiah.
SELECT to_number('7,000.25', '9,999.99');
Hasil:
7000.25
Opsi kedua adalah menggunakan versi yang sadar-lokal. Ini adalah G untuk pemisah grup (pemisah ribuan), dan D untuk titik desimal.
Jadi contoh sebelumnya dapat ditulis ulang sebagai berikut:
SELECT to_number('7,000.25', '9G999D99');
Hasil:
7000.25
Simbol Mata Uang
L
pola template mewakili simbol mata uang lokal.
SELECT to_number('$7,000.25', 'L9G999D99');
Hasil:
7000.25
Jenis Pengembalian
Nilai kembalian to_number()
fungsi adalah numerik.
Anda dapat memeriksa jenis pengembalian dengan pg_typeof()
fungsi.
SELECT pg_typeof(to_number('$7,000.25', 'L9G999D99'));
Hasil:
numeric
Hasil Tak Terduga?
Sangat penting untuk mendapatkan template yang benar. Jika tidak, Anda bisa mendapatkan hasil yang tidak terduga.
Berikut adalah contoh yang terjadi jika saya lupa menyertakan L
pola template dari contoh sebelumnya.
SELECT to_number('$7,000.25', '9G999D99');
Hasil:
7000
Jadi karena saya lupa memasukkan L
pola template (untuk mata uang), ini membuat seluruh template tidak sinkron dengan nomor, yang mengakibatkan G
diabaikan, serta D
.
Untuk memperjelas, ini dia lagi jika dibandingkan dengan template yang benar.
SELECT
to_number('$7,000.25', 'L9G999D99') AS "Right",
to_number('$7,000.25', '9G999D99') AS "Wrong";
Hasil:
Right | Wrong ---------+------- 7000.25 | 7000
to_number() vs cast()
to_number()
fungsi disediakan terutama untuk menangani format input yang tidak dapat dikonversi dengan casting sederhana. Oleh karena itu umumnya tidak perlu untuk representasi numerik standar.
Jadi contoh pertama di halaman ini bisa dilakukan dengan menggunakan cast()
.
SELECT cast('80' AS NUMERIC);
Hasil:
80
Tapi kami mulai mengalami masalah setelah semuanya menjadi sedikit lebih rumit.
SELECT cast('$7,000.25' AS NUMERIC);
Hasil:
ERROR: invalid input syntax for type numeric: "$7,000.25" LINE 1: SELECT cast('$7,000.25' AS NUMERIC);
Jadi to_number()
terutama dirancang untuk situasi seperti ini.
Daftar Lengkap Pola &Pengubah Template
Postgres menyertakan lebih banyak pola dan pengubah template.
Ini juga dapat digunakan saat memformat nilai numerik (misalnya saat menggunakan to_char()
fungsi untuk mengembalikan representasi string yang diformat dari nomor).
Lihat Pola &Pengubah Template untuk Pemformatan Numerik di PostgreSQL untuk daftar lengkapnya.