Biểu thức stringexpression = ''
sản lượng:
TRUE
.. cho ''
(hoặc cho bất kỳ chuỗi chỉ bao gồm khoảng trắng với kiểu dữ liệu char(n)
)
NULL
.. cho NULL
FALSE
.. cho bất cứ điều gì 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 với bất kỳ loại ký tự nào bao gồm char(n)
. Hướng dẫn về các 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()
, gây ra tiếng ồn tốn kém cho char(n)
(xem bên dưới), hoặc không chính xác đối với các loại ký tự khác:chuỗi chỉ bao gồm khoảng trắng sẽ chuyển thành chuỗi trống.
coalesce(stringexpression, '') = ''
Nhưng các biểu thức ở trên cùng nhanh hơn.
Khẳng định ngược lại thậm chí còn đơn giản hơn: "stringexpression
không phải NULL cũng không rỗng " :
stringexpression <> ''
Giới thiệu về char(n)
Đây là về kiểu dữ liệu char(n)
, viết tắt của:character(n)
. (char
/ character
là 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 ký tựcharacter varying
nên được sử dụng thay thế.
Đừng nhầm lẫn với char(n)
với các kiểu ký tự khác, hữu ích, varchar(n)
, varchar
, text
hoặc "char"
(có dấu ngoặc kép).
Trong char(n)
một chuỗi trống không khác với bất kỳ chuỗi nào khác chỉ bao gồm dấu cách. Tất cả những thứ này đều được gấp thành n dấu cách trong char(n)
theo định nghĩa của loại. Theo logic, các biểu thức trên hoạt động cho char(n)
cũng như vậy - nhiều như những điều này (sẽ không hoạt động với các loại ký tự khác):
coalesce(stringexpression, ' ') = ' '
coalesce(stringexpression, '') = ' '
Bản trình diễn
Chuỗi trống tương đương với bất kỳ chuỗi dấu cách nào khi được 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 "chuỗi null hoặc 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ả:
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
Kiểm tra "chuỗi null hoặc 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ả:
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 <> fiddle here
Sqlfiddle cũ
Có liên quan:
- Bất kỳ nhược điểm nào của việc sử dụng kiểu dữ liệu "văn bản" để lưu trữ chuỗi?