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
textataucharacter varyingharus 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?