การแสดงออกstringexpression = ''
ให้ผล:
TRUE
.. สำหรับ''
(หรือสำหรับสตริงใด ๆ ที่ประกอบด้วยช่องว่างเฉพาะกับชนิดข้อมูลchar(n)
)
NULL
..NULL
FALSE
.. สำหรับสิ่งอื่นใด
ดังนั้นเพื่อตรวจสอบว่า: " stringexpression
เป็น NULL หรือเปล่า" :
(stringexpression = '') IS NOT FALSE
หรือวิธีย้อนกลับ (อาจอ่านง่ายกว่า):
(stringexpression <> '') IS NOT TRUE
การทำงานสำหรับพิมพ์ตัวอักษรใด ๆchar(n)
รวมทั้ง คู่มือเกี่ยวกับตัวดำเนินการเปรียบเทียบ
หรือใช้นิพจน์ดั้งเดิมของคุณโดยไม่มีtrim()
ซึ่งเป็นค่าใช้จ่ายสำหรับchar(n)
(ดูด้านล่าง) หรือไม่ถูกต้องสำหรับประเภทอักขระอื่น ๆ : สตริงที่ประกอบด้วยช่องว่างเท่านั้นจะผ่านเป็นสตริงว่าง
coalesce(stringexpression, '') = ''
แต่การแสดงออกที่ด้านบนนั้นเร็วกว่า
การยืนยันสิ่งที่ตรงกันข้ามนั้นง่ายกว่า: " stringexpression
ไม่มีค่าว่างหรือว่างเปล่า" :
stringexpression <> ''
นี้เป็นเรื่องเกี่ยวกับชนิดข้อมูลสั้น:char(n)
character(n)
( char
/ character
สั้นสำหรับchar(1)
/ character(1)
.) การใช้งานไม่ได้ผลใน Postgres :
ในสถานการณ์ส่วนใหญ่text
หรือcharacter varying
ควรใช้แทน
อย่าสับสนchar(n)
กับประเภทอื่น ๆ ที่มีประโยชน์, ตัวละครvarchar(n)
, varchar
, text
หรือ"char"
(กับราคาสองครั้ง)
ในสตริงที่ว่างเปล่าchar(n)
ไม่แตกต่างจากสายอื่น ๆ ใด ๆ ที่ประกอบด้วยช่องว่างเท่านั้น สิ่งเหล่านี้ทั้งหมดถูกพับเป็นช่องว่างnchar(n)
ตามการกำหนดชนิด มันเป็นไปตามหลักเหตุผลว่านิพจน์ด้านบนใช้งานได้char(n)
ดีเช่นกัน (ซึ่งไม่สามารถใช้ได้กับอักขระประเภทอื่น):
coalesce(stringexpression, ' ') = ' '
coalesce(stringexpression, '') = ' '
การสาธิต
สตริงว่างเท่ากับสตริงช่องว่างใด ๆ เมื่อส่งถึงchar(n)
:
SELECT ''::char(5) = ''::char(5) AS eq1
, ''::char(5) = ' '::char(5) AS eq2
, ''::char(5) = ' '::char(5) AS eq3;
ผลลัพธ์:
eq1 | eq2 | eq3
----+-----+----
t | t | t
ทดสอบสำหรับ "null หรือสตริงว่าง" ด้วย 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);
ผลลัพธ์:
stringexpression | base_test | ทดสอบ 1 | ทดสอบ 2 | coalesce1 | coalesce2 | coalesce3
------------------ + ----------- + ------- + ------- + --- -------- + + ----------- -----------
foo | f | f | f | f | f | ฉ
| t | t | t | t | t | เสื้อ
| t | t | t | t | t | เสื้อ
null | null | t | t | t | t | เสื้อ
ทดสอบสำหรับ "null หรือสตริงว่าง" ด้วย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);
ผลลัพธ์:
stringexpression | base_test | ทดสอบ 1 | ทดสอบ 2 | coalesce1 | coalesce2 | coalesce3
------------------ + ----------- + ------- + ------- + --- -------- + + ----------- -----------
foo | f | f | f | f | f | ฉ
| t | t | t | t | f | ฉ
| f | f | f | f | f | ฉ
null | null | t | t | t | t | ฉ
db <> fiddle here sqlfiddle ตัว
เก่า
ที่เกี่ยวข้อง:
char
มักเป็นทางเลือกที่ผิดเนื่องจากการขยาย (และทำให้พื้นที่ใช้งานหมด) แต่นอกเหนือจากนั้นฉันไม่คิดว่าจะมีทางออกที่ดีกว่า