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

Cara terbaik untuk memeriksa nilai kosong atau nol

Ekspresi stringexpression = '' hasil:

TRUE .. untuk '' (atau untuk apa saja string yang hanya terdiri dari spasi dengan tipe data char(n) )
NULL .. untuk NULL
FALSE .. untuk hal lain

Jadi untuk memeriksa:"stringexpression adalah NULL atau kosong" :

(stringexpression = '') IS NOT FALSE

Atau pendekatan sebaliknya (mungkin lebih mudah dibaca):

(stringexpression <> '') IS NOT TRUE

Berfungsi untuk semua jenis karakter termasuk char(n) . Manual tentang operator perbandingan.

Atau gunakan ekspresi asli Anda tanpa trim() , yang merupakan noise mahal untuk char(n) (lihat di bawah), atau salah untuk tipe karakter lain:string yang hanya terdiri dari spasi akan lulus sebagai string kosong.

coalesce(stringexpression, '') = ''

Tapi ekspresi di atas lebih cepat.

Menegaskan kebalikannya bahkan lebih sederhana:"stringexpression bukan NULL atau kosong" :

stringexpression <> ''

Tentang char(n)

Ini tentang tipe data char(n) , kependekan dari:character(n) . (char / character kependekan dari char(1) / character(1) .) Penggunaannya tidak disarankan di Postgres:

Dalam kebanyakan situasi text atau character varying harus digunakan sebagai gantinya.

Jangan bingung char(n) dengan jenis karakter lain yang berguna varchar(n) , varchar , text atau "char" (dengan tanda kutip ganda).

Dalam char(n) sebuah string kosong tidak berbeda dengan string lain yang hanya terdiri dari spasi. Semua ini dilipat menjadi n spasi di char(n) per definisi jenis. Ini mengikuti secara logis bahwa ekspresi di atas berfungsi untuk char(n) juga - sebanyak ini (yang tidak akan bekerja untuk tipe karakter lain):

coalesce(stringexpression, '  ') = '  '
coalesce(stringexpression, '') = '       '

Demo

String kosong sama dengan string spasi apa pun saat dilemparkan ke char(n) :

SELECT ''::char(5) = ''::char(5)     AS eq1
     , ''::char(5) = '  '::char(5)   AS eq2
     , ''::char(5) = '    '::char(5) AS eq3;

Hasil:

 eq1 | eq2 | eq3
 ----+-----+----
 t   | t   | t

Uji "string nol atau kosong" dengan char(n) :

SELECT stringexpression 
     , stringexpression = ''                   AS base_test
     , (stringexpression = '')  IS NOT FALSE   AS test1
     , (stringexpression <> '') IS NOT TRUE    AS test2
     , coalesce(stringexpression, '') = ''     AS coalesce1
     , coalesce(stringexpression, '  ') = '  ' AS coalesce2
     , coalesce(stringexpression, '') = '  '   AS coalesce3
FROM  (
   VALUES
     ('foo'::char(5))
   , ('')
   , ('   ')                -- not different from '' in char(n)
   , (NULL)
   ) sub(stringexpression);

Hasil:

 stringexpression | base_test | test1 | test2 | coalesce1 | coalesce2 | coalesce3 
------------------+-----------+-------+-------+-----------+-----------+-----------
 foo              | f         | f     | f     | f         | f         | f
                  | t         | t     | t     | t         | t         | t
                  | t         | t     | t     | t         | t         | t
 null             | null      | t     | t     | t         | t         | t

Uji "string nol atau kosong" dengan text :

SELECT stringexpression 
     , stringexpression = ''                   AS base_test
     , (stringexpression = '')  IS NOT FALSE   AS test1
     , (stringexpression <> '') IS NOT TRUE    AS test2
     , coalesce(stringexpression, '') = ''     AS coalesce1
     , coalesce(stringexpression, '  ') = '  ' AS coalesce2
     , coalesce(stringexpression, '') = '  '   AS coalesce3
FROM  (
   VALUES
     ('foo'::text)
   , ('')
   , ('   ')                -- different from '' in a sane character types
   , (NULL)
   ) sub(stringexpression);

Hasil:

 stringexpression | base_test | test1 | test2 | coalesce1 | coalesce2 | coalesce3 
------------------+-----------+-------+-------+-----------+-----------+-----------
 foo              | f         | f     | f     | f         | f         | f
                  | t         | t     | t     | t         | f         | f
                  | f         | f     | f     | f         | f         | f
 null             | null      | t     | t     | t         | t         | f

db<>main biola di sini
sqlfiddle lama

Terkait:

  • Apakah ada kerugian menggunakan tipe data "teks" untuk menyimpan string?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Praktik Terbaik Pencatatan Audit PostgreSQL

  2. Bagaimana POSITION() Bekerja di PostgreSQL

  3. psycopg2 bagaimana menangani TypeError:tidak semua argumen dikonversi selama pemformatan string

  4. apa urutan pelarian untuk tanda hubung (-) di PostgreSQL

  5. Hitung persentase dari SUM() dalam kueri sql SELECT yang sama