Ekspresi stringexpression = ''menghasilkan:
TRUE .. untuk ''(atau untuk string apa pun yang hanya terdiri dari spasi dengan tipe data char(n))
NULL .. untukNULL
FALSE .. untuk hal lain
Jadi untuk memeriksa: " stringexpressionapakah NULL atau kosong" :
(stringexpression = '') IS NOT FALSE
Atau pendekatan sebaliknya (mungkin lebih mudah dibaca):
(stringexpression <> '') IS NOT TRUE
Bekerja 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 dilewatkan sebagai string kosong.
coalesce(stringexpression, '') = ''
Tetapi ekspresi di atas lebih cepat.
Menyatakan yang sebaliknya bahkan lebih sederhana: " stringexpressionbukan NULL atau kosong" :
stringexpression <> ''
Ini adalah tentang tipe data char(n), singkatan: character(n). ( char/ characterkependekan dari char(1)/ character(1).) Penggunaannya tidak disarankan di Postgres :
Dalam sebagian besar situasi textatau character varyingharus digunakan sebagai gantinya.
Jangan bingung char(n)dengan tipe karakter lain yang bergunavarchar(n) , varchar, textatau"char" (dengan tanda kutip ganda).
Dalam char(n)sebuah string kosong tidak berbeda dari string lain yang terdiri dari ruang saja. Semua ini dilipat menjadi n spasi dichar(n) per definisi jenis. Secara logis berikut bahwa ekspresi di atas berfungsi char(n)juga - sama seperti 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 kosong 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 | menyatu3
------------------ + ----------- + ------- + ------- + --- -------- + ----------- + -----------
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 kosong 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 | menyatu3
------------------ + ----------- + ------- + ------- + --- -------- + ----------- + -----------
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 <> biola di sini
Old sqlfiddle
Terkait:
charhampir selalu merupakan pilihan yang salah karena padding (dan menghasilkan ruang buang). Namun terlepas dari itu: Saya tidak berpikir ada solusi yang lebih baik.