PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách tốt nhất để kiểm tra giá trị trống hoặc rỗng

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?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm giá trị không chứa số trong PostgreSQL

  2. Làm cách nào để ghép hai từ cuối cùng trong một câu trong PostgreSQL?

  3. Hiệu suất TPC-H kể từ PostgreSQL 8.3

  4. Khung thực thể PostgreSQL

  5. Tại sao PostgreSQL không thích tên bảng UPPERCASE?