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: " stringexpression
apakah 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: " stringexpression
bukan NULL atau kosong" :
stringexpression <> ''
Ini adalah tentang tipe data char(n)
, singkatan: character(n)
. ( char
/ character
kependekan dari char(1)
/ character(1)
.) Penggunaannya tidak disarankan di Postgres :
Dalam sebagian besar situasi text
atau character varying
harus digunakan sebagai gantinya.
Jangan bingung char(n)
dengan tipe karakter lain yang bergunavarchar(n)
, varchar
, text
atau"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:
char
hampir selalu merupakan pilihan yang salah karena padding (dan menghasilkan ruang buang). Namun terlepas dari itu: Saya tidak berpikir ada solusi yang lebih baik.