İfade şu sonuçları stringexpression = ''
verir:
TRUE
.. için ''
(veya yalnızca veri türüne sahip boşluklardan oluşan herhangi bir dize için char(n)
)
NULL
.. için NULL
FALSE
.. başka bir şey için
Bu yüzden kontrol etmek için: " stringexpression
boş veya boş" :
(stringexpression = '') IS NOT FALSE
Veya tersine yaklaşım (okunması daha kolay olabilir):
(stringexpression <> '') IS NOT TRUE
Dahil herhangi bir karakter türü için çalışır char(n)
. Karşılaştırma operatörleri kılavuzu.
Veya orijinal ifadenizi kullanmayın trim()
, bu maliyet char(n)
düşüktür (aşağıya bakın) veya diğer karakter türleri için yanlıştır: yalnızca boşluklardan oluşan dizeler boş dize olarak geçer.
coalesce(stringexpression, '') = ''
Ancak üstteki ifadeler daha hızlıdır.
Aksini iddia etmek daha da basittir: " stringexpression
ne NULL ne de boş" :
stringexpression <> ''
Bu, veri türüyle ilgilidir char(n)
: kısaltması character(n)
. ( char
/ character
İçin kısa char(1)
/ ' character(1)
.) Kullanımı edilir Postgres cesaretini :
Çoğu durumda text
veya character varying
bunun yerine kullanılmalıdır.
Karıştırmayın char(n)
diğer yararlı, karakter tipleri varchar(n)
, varchar
, text
veya"char"
(çift tırnak).
Gelen char(n)
bir boş bir dizge , boşluklar oluşan her hangi bir başka dizisinden farklı değildir. Bunların tümü , tip tanımına göre n boşluğa katlanır char(n)
. Yukarıdaki ifadelerin char(n)
de aynı şekilde (diğer karakter türleri için işe yaramayacak kadar) işe yaradığı mantıklı bir şekilde sonuçlanır:
coalesce(stringexpression, ' ') = ' '
coalesce(stringexpression, '') = ' '
gösteri
Boş dize, şuraya verildiğinde boşluk dizesine eşittir char(n)
:
SELECT ''::char(5) = ''::char(5) AS eq1
, ''::char(5) = ' '::char(5) AS eq2
, ''::char(5) = ' '::char(5) AS eq3;
Sonuç:
eq1 | eq2 | eq3
----+-----+----
t | t | t
Şununla "boş veya boş dize" için test yapın 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);
Sonuç:
stringexpression | base_test | test1 | test2 | birleşme1 | 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
Şununla "boş veya boş dize" için test yapın 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);
Sonuç:
stringexpression | base_test | test1 | test2 | birleşme1 | 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 <> keman burada
Eski sqlfiddle
İlişkili:
char
Dolgu (ve sonuçta alan israfı) nedeniyle kullanmak neredeyse her zaman yanlış seçimdir. Ama bunun dışında: Daha iyi bir çözüm olduğunu sanmıyorum.