Biểu thức stringexpression = ''
mang lại:
TRUE
.. cho ''
(hoặc cho bất kỳ chuỗi nào chỉ bao gồm khoảng trắng với kiểu dữ liệu char(n)
)
NULL
.. cho NULL
FALSE
.. cho mọi thứ khác
Vì vậy, để kiểm tra: " stringexpression
là NULL hoặc trống" :
(stringexpression = '') IS NOT FALSE
Hoặc cách tiếp cận ngược lại (có thể dễ đọc hơn):
(stringexpression <> '') IS NOT TRUE
Hoạt động cho bất kỳ loại nhân vật bao gồm char(n)
. Hướng dẫn về toán tử so sánh.
Hoặc sử dụng biểu thức ban đầu của bạn mà không có trim()
nhiễu gây tốn kém cho char(n)
(xem bên dưới) hoặc không chính xác cho các loại ký tự khác: các chuỗi chỉ bao gồm các khoảng trắng sẽ chuyển qua dưới dạng chuỗi trống.
coalesce(stringexpression, '') = ''
Nhưng các biểu thức ở đầu nhanh hơn.
Khẳng định điều ngược lại thậm chí còn đơn giản hơn: " stringexpression
không phải là NULL cũng không trống rỗng" :
stringexpression <> ''
Đây là về kiểu dữ liệu char(n)
, viết tắt của : character(n)
. ( char
/ character
viết tắt của char(1)
/ character(1)
.) Việc sử dụng nó không được khuyến khích trong Postgres :
Trong hầu hết các tình huống text
hoặc character varying
nên được sử dụng thay thế.
Đừng nhầm lẫn char(n)
với các loại khác, hữu ích, nhân vật varchar(n)
, varchar
, text
hoặc"char"
(trong dấu ngoặc kép).
Trong char(n)
một chuỗi rỗng không khác với bất kỳ chuỗi nào khác chỉ bao gồm các khoảng trắng. Tất cả những thứ này được gấp lại thành n khoảng trắng char(n)
theo định nghĩa của loại. Nó tuân theo logic rằng các biểu thức trên cũng hoạt động char(n)
tốt - cũng giống như các biểu thức này (sẽ không hoạt động đối với các loại ký tự khác):
coalesce(stringexpression, ' ') = ' '
coalesce(stringexpression, '') = ' '
Bản giới thiệu
Chuỗi rỗng bằng với bất kỳ chuỗi khoảng trắng nào khi truyền tới char(n)
:
SELECT ''::char(5) = ''::char(5) AS eq1
, ''::char(5) = ' '::char(5) AS eq2
, ''::char(5) = ' '::char(5) AS eq3;
Kết quả:
eq1 | eq2 | eq3
----+-----+----
t | t | t
Kiểm tra "null hoặc chuỗi rỗng" với 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);
Kết quả:
biểu hiện chuỗi | cơ sở | kiểm tra1 | kiểm tra2 | hợp nhất1 | hợp nhất2 | hợp nhất3
------------------ + ----------- + ------- + ------- + --- -------- + ----------- + -----------
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
Kiểm tra "null hoặc chuỗi rỗng" với 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);
Kết quả:
biểu hiện chuỗi | cơ sở | kiểm tra1 | kiểm tra2 | hợp nhất1 | hợp nhất2 | hợp nhất3
------------------ + ----------- + ------- + ------- + --- -------- + ----------- + -----------
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 <> fiddle ở đây sqlfiddle
cũ
Liên quan:
char
hầu như luôn luôn là lựa chọn sai do đệm (và kết quả là lãng phí không gian). Nhưng ngoài ra: tôi không nghĩ có một giải pháp tốt hơn.