วิธีใช้ NULL หรือสตริงว่างใน SQL


129

ฉันต้องการทราบวิธีการใช้ NULL และสตริงว่างพร้อมกันในWHEREอนุประโยคใน SQL Server ฉันต้องการค้นหาระเบียนที่มีค่า null หรือสตริงว่าง ขอบคุณ


5
มีคำหลัก OR ใน SQL
Robert Harvey

13
คำถามนี้ไม่ได้แสดงถึงความพยายามในการค้นคว้า มันเป็นสิ่งสำคัญที่จะทำบ้านของคุณ บอกเราว่าคุณพบอะไรและเหตุใดจึงไม่ตรงกับความต้องการของคุณ สิ่งนี้แสดงให้เห็นว่าคุณได้ใช้เวลาในการพยายามช่วยเหลือตัวเองช่วยให้เราไม่ต้องย้ำคำตอบที่ชัดเจนและที่สำคัญที่สุดคือช่วยให้คุณได้รับคำตอบที่เฉพาะเจาะจงและตรงประเด็นมากขึ้น คำถามที่พบบ่อย
มิต

1
เป็นไปได้ที่จะทำซ้ำวิธีการเลือกข้อมูลจากตาราง MySQL โดยที่คอลัมน์เป็น NULL (นี่คือคำถาม MySQL แต่โดยทั่วไปแล้วคำตอบเดียวกันสำหรับ t-sql)
Michael Berkowski

คำตอบ:




25

ถ้าคุณต้องการในส่วนSELECTสามารถใช้เช่นนี้

    SELECT  ct.ID, 
            ISNULL(NULLIF(ct.LaunchDate, ''), null) [LaunchDate]
    FROM    [dbo].[CustomerTable] ct

คุณสามารถแทนที่nullด้วยค่าทดแทนของคุณ


1
NVL ของ Oracle (var1, 'value') จะดูแลการแทนที่สตริงว่าง '' Isnull ของ T-SQL (var1, 'value') ไม่ได้
Jenna Leaf

15
SELECT *
FROM   TableName
WHERE  columnNAme IS NULL OR 
       LTRIM(RTRIM(columnName)) = ''

2
SELECT * FROM TableName WHERE columnNAme IS NULL or RTRIM (columnName) = ''
Xavier John

2
ดังที่ซาเวียร์ชี้ให้เห็นไม่จำเป็นต้องทำทั้งสองอย่างltrimและrtrimหากเป้าหมายเป็นเพียงเพื่อเปรียบเทียบกับสตริงว่าง เหตุผล: หากมีเพียงช่องว่างการตัดแต่งเพียงครั้งเดียวจะลบทั้งหมด ตัวอย่างเช่นคุณไม่สนใจว่าการเปรียบเทียบจะล้มเหลวเพราะสิ่งที่เหลืออยู่คือ "abc" หรือ "abc"
ToolmakerSteve

8

หากต้องการค้นหาแถวที่ col อยู่NULLสตริงว่างหรือช่องว่าง (ช่องว่างแท็บ):

SELECT *
FROM table
WHERE ISNULL(LTRIM(RTRIM(col)),'')=''

หากต้องการค้นหาแถวที่ col อยู่NOT NULLสตริงว่างหรือช่องว่าง (ช่องว่างแท็บ):

SELECT *
FROM table
WHERE ISNULL(LTRIM(RTRIM(col)),'')<>''

7

บางวิธีที่ถากถาง ...

SELECT *
FROM #T
WHERE SomeCol = '' OR SomeCol IS NULL;

SELECT *
FROM #T
WHERE SomeCol = '' 
UNION ALL
SELECT *
FROM #T
WHERE  SomeCol IS NULL;

SELECT *
FROM #T
WHERE EXISTS ((SELECT NULL UNION SELECT '') INTERSECT SELECT SomeCol);

และบางคนที่ไม่สามารถเสียดสีได้ ...

SELECT *
FROM #T
WHERE IIF(SomeCol <> '',0,1) = 1;

SELECT *
FROM #T
WHERE NULLIF(SomeCol,'') IS NULL;

SELECT *
FROM #T
WHERE ISNULL(SomeCol,'') = '';


3

ทางออกที่ดีที่สุดของฉัน:

 WHERE  
 COALESCE(char_length(fieldValue), 0) = 0

COALESCE ส่งกลับค่า expr ที่ไม่ใช่ค่าว่างแรกในรายการนิพจน์ ()

ถ้า fieldValue เป็น null หรือสตริงว่างเราจะส่งคืนองค์ประกอบที่สองตามด้วย 0

ดังนั้น 0 จึงเท่ากับ 0 ดังนั้น fieldValue นี้จึงเป็นสตริงว่างหรือว่าง

ใน python สำหรับตัวอย่าง:

def coalesce(fieldValue):
    if fieldValue in (null,''):
        return 0

โชคดี


2

คุณสามารถใช้isnullฟังก์ชันเพื่อรับทั้งnullค่าและค่าว่างของช่องข้อความ:

SELECT * FROM myTable
WHERE isnull(my_nullable_text_field,'') = ''

ฟังก์ชัน isnull เพียงตรวจสอบว่าค่าเป็นโมฆะหรือไม่ จะไม่ทำงานหากสตริงว่างเปล่า ("")
Max Pringle

@ แม็กซ์พริงเกิล. ฉันไม่ได้ระบุว่าแตกต่างกัน นอกจากนี้รหัสที่ให้ไว้จะตอบคำถาม ไม่แน่ใจเกี่ยวกับการมีส่วนร่วมของคุณ แนะนำให้แก้ไขแทนการลงคะแนน
Alberto De Caro

จะรับคำแนะนำของคุณ ฉันใส่การแก้ไขที่แนะนำตอนนี้ ที่ซึ่ง clause รับเฉพาะค่า null ไม่ใช่ค่าสตริงว่าง สามารถใช้ nullif เพื่อรับค่าว่างได้
Max Pringle

2

คุณตรวจสอบ null ด้วย IS NULL และสตริงว่างเปล่าด้วย LEN (RTRIM (LTRIM (คอลัมน์))) = 0 นิ้ว

SELECT *
FROM AppInfra.Person
WHERE   LEN(RTRIM(LTRIM(NationalCode))) = 0 OR  NationalCode IS NULL



1
--setup
IF OBJECT_ID('tempdb..#T') IS NOT NULL DROP TABLE #T;
CREATE TABLE #T(ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, NAME VARCHAR(10))
INSERT INTO #T (Name) VALUES('JOHN'),(''),(NULL);
SELECT * FROM #T
 1  JOHN
 2  -- is empty string
 3  NULL

คุณสามารถตรวจสอบ''เป็นNULLโดยการแปลงไปNULLใช้NULLIF

--here you set '' to null
UPDATE #T SET NAME = NULLIF(NAME,'')
SELECT * FROM #T 
 1  JOHN
 2  NULL
 3  NULL

หรือคุณสามารถตรวจสอบNULLขณะที่''ใช้SELECT ISNULL(NULL,'')

-- here you set NULL to ''
UPDATE #T SET NAME = ISNULL(NULL,'') WHERE NAME IS NULL
SELECT * FROM #T
1   JOHN
2   -- is empty string
3   -- is empty string

--clean up
DROP TABLE #T


1

โดยฟังก์ชันนี้:

ALTER FUNCTION [dbo].[isnull](@input nvarchar(50),@ret int = 0)
RETURNS int
AS
BEGIN

    return (case when @input='' then @ret when @input is null then @ret else @input end)

END

และใช้สิ่งนี้:

dbo.isnull (ค่า 0)


1
SELECT * FROM DBO.AGENDA
WHERE 
  --IF @DT_START IS NULL OR EMPTY
  ( ISNULL( @DT_START,'' ) = '' AND DT_START IS NOT NULL ) -- GET ALL DATE
  OR --ELSE
  ( DT_START >= @DT_START ) --FILTER

-- MORE FILTER

SELECT * FROM DBO.AGENDA
WHERE 
  ( ( ISNULL( @DT_START,'' ) = '' AND DT_START IS NOT NULL ) OR ( DT_START >= @DT_START ) ) 
  AND
  DT_END < GETDATE()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.