2016-11-29 335 views
0

我试图在查询中构建一个不同的字符串,除非其中一个值为NULL,否则它将工作。我已经测试删除LOCATION_ADDR_LINE_2,并且查询会正常工作。当我不选择DISTINCT时,我发现LOCATION_ADDR_LINE_2值为NULL。我如何在SELECT DISTINCT中收集这些值,即使NULL?SELECT DISTINCT在不需要时省略NULL值

SELECT  DISTINCT(LOCATION_ADDR_LINE_1 + ', ' + LOCATION_ADDR_LINE_2 + ', ' + LOCATION_CITY + ', ' + LOCATION_WORK_STATE) AS Addresses 
FROM  OracleReport 
WHERE  (LOCATION_ADDR_LINE_1 LIKE '%1135 Auto%' OR LOCATION_ADDR_LINE_1 LIKE '%199 Easy%') 

返回:

地址 NULL

SELECT  DISTINCT(LOCATION_ADDR_LINE_1 + ', ' + LOCATION_CITY + ', ' + LOCATION_WORK_STATE) AS Addresses 
FROM  [OperationReport].[dbo].[OracleReport] 
WHERE  (LOCATION_ADDR_LINE_1 LIKE '%1135 Auto%' OR LOCATION_ADDR_LINE_1 LIKE '%199 Easy%') 

返回:

地址

1135自动...

189-199容易...

+0

将coalesce(field,'')中的每个值包装为零以将其更改为长度为零的字符串。但是,如果这是Oracle可能无法正常工作。用+代替||来判断尽管coalesce应该可以正常工作。 – xQbert

+0

对于Oracle,有NVL() –

+0

这是针对从Oracle数据构建的SQL表的SQL查询。长话短说,它是更大机器的一部分,不需要直接查询Oracle。 –

回答

1

假设你不介意text,,text,...(空字符串)当值为NULL ...

SELECT DISTINCT(coalesce(LOCATION_ADDR_LINE_1,'') + ', ' +    
       coalesce(LOCATION_ADDR_LINE_2,'') + ', ' + 
       coalesce(LOCATION_CITY,'') + ', ' + 
       coalesce(LOCATION_WORK_STATE,'')) AS Addresses 
FROM OracleReport 
WHERE (LOCATION_ADDR_LINE_1 LIKE '%1135 Auto%' 
    OR LOCATION_ADDR_LINE_1 LIKE '%199 Easy%') 

合并会第一非空值并返回它。它需要一致的数据类型,并且一旦遇到系列中的第一个非空值,就会提前退出。 (更多详细信息Oracle Differences between NVL and Coalesce

+0

以前从来没有用过,但它的工作!太感谢了! –

+0

*** Atari 7800平台屏幕名称的额外分数*** –

+0

从技术上讲,这是Q * Bert – xQbert