PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana Fungsi to_number() Bekerja di PostgreSQL

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ubah Nama Bulan menjadi Nomor Bulan di PostgreSQL

  2. Apa cara tercepat untuk memotong cap waktu menjadi 5 menit di Postgres?

  3. Tambahkan interval ke stempel waktu menggunakan Ecto Fragments

  4. Menghapus catatan dari database postgresql jarak jauh menggunakan daftar yang disediakan secara lokal

  5. postgresql COUNT(DISTINCT ...) sangat lambat