如果没有为查询选择行,则将空值替换为“N”

时间:2017-08-08 13:37:33

标签: sql sql-server

我希望在列值为null时将列值替换为'N',或者在执行查询时没有选择行。请参阅下面的查询:

Select case when ISNULL(myCol,'')='' then 'N' end as col
FROM myTable where <conditions>

如果查询结果为空,我希望myCol值为'N'。如果可行,请告诉我。

4 个答案:

答案 0 :(得分:1)

试试这个:

SELECT ISNULL((SELECT ISNULL(myCol,'N') FROM myTable where <conditions>), 'N')

返回行时使用内部ISNULL但其值为null,如果查询未返回任何行,则使用外部ISNULL

我的试用版:

CREATE TABLE #APP (ID VARCHAR(20))
INSERT INTO #APP VALUES ('1'), ('2'), ('3'), (NULL)

此查询将返回 M (因为我选择ID = NULL的唯一行)

SELECT ISNULL((SELECT ISNULL(ID,'M') FROM #APP WHERE ID IS NULL), 'N')

此查询将返回 N (因为我不会占用任何行)

SELECT ISNULL((SELECT ISNULL(ID,'M') FROM #APP WHERE ID = '100'), 'N')

答案 1 :(得分:0)

您可以简单地使用ISNULL的第二个参数将空值替换为不同的值,不需要case语句:

Select ISNULL(myCol,'N') FROM myTable where <conditions>

要替换空白值(不是NULL值):

SELECT myCol = COALESCE(NULLIF(LTRIM(RTRIM(myCol)), ''),'N') 
FROM myTable where <conditions> 

答案 2 :(得分:0)

与填充行联合,如果原始查询返回至少一行

,则排除该行
select top(1) with ties col
from(
    -- original query 
    Select ISNULL(myCol,'N') as col
       , row_number() over (order by myCol) rn
       , 1 priority
    from myTable 
    where <conditions>
    -- a filler row
    UNION 
    select 'N' col, 1, 2  -- filler row with low priority
    ) t
order by row_number() over (partition by rn order by priority);

答案 3 :(得分:0)

以Joe Taras为基础&#39; (正确)回答:

if object_id ( 'tempdb..#APP' ) IS NOT NULL
  DROP TABLE #APP

CREATE TABLE #APP (ID VARCHAR(20))
INSERT INTO #APP VALUES ('1'), ('2'), ('3'), (NULL)

SELECT ISNULL((SELECT ISNULL(ID,'N') FROM #APP where ID = 1), 'N')
SELECT ISNULL((SELECT ISNULL(ID,'N') FROM #APP where ID = 2), 'N')
SELECT ISNULL((SELECT ISNULL(ID,'N') FROM #APP where ID = 3), 'N')
SELECT ISNULL((SELECT ISNULL(ID,'N') FROM #APP where ID = 4), 'N')