在忽略NULL值

时间:2015-11-16 15:25:37

标签: postgresql null concatenation

我正在尝试连接2列(一个是CHAR(7),另一个是CHAR(6)),在2之间添加一个_分隔符,并将结果限制为10,000个记录。我也想随机抽样。

我在这里阅读了很多优秀的帖子,包括:

Combine two columns and add into one new column

以上帖子和我看过的其他帖子对我来说都有很好的起点,但我还没有达到预期的效果。

首先我尝试了:

SELECT osnrth1m||'_'||oseast1m FROM postzon
ORDER BY RANDOM()
LIMIT 10000

虽然它传递了'1234567_123456'形式的正确结果(忽略引号),但仍有许多结果为'_'。

上面的链接帖子说这是因为使用连接运算符(即attribute1 || attribute2)不考虑NULL值。

然后我尝试使用COALESCE函数:

SELECT COALESCE(osnrth1m,'')||'_'||COALESCE(oseast1m,'') FROM postzon
ORDER BY RANDOM()
LIMIT 10000;

但是这也产生了一些结果,这些结果只是前面的下划线。

然后我尝试了CONCAT_WS功能:

SELECT CONCAT_WS('_',osnrth1m,oseast1m) FROM postzon
ORDER BY RANDOM()
LIMIT 10000;

但不幸的是,有些行只返回一个下划线。

最后我试着搞乱CASE - 我无法找到一种编写查询的方法,以便忽略NULL值。事实上,我试过的最后一个具体说如果NULL然后将结果显示为NULL(这就是我认为它仍然在说!):

SELECT CASE WHEN (osnrth1m,oseast1m) IS NULL THEN NULL
        ELSE CONCAT_WS('_',osnrth1m,oseast1m) 
        END
        FROM postzon
ORDER BY RANDOM()
LIMIT 10000;

我很抱歉,如果我错过了一些非常明显的东西,但是有人可以建议一种方法来实现这一点,只会完全跳过NULL值吗?

有些事情:

SELECT CASE WHEN (osnrth1m,oseast1m) IS NULL THEN IGNORE/DROP/EXCLUDE
            ELSE CONCAT_WS('_',osnrth1m,oseast1m) 
            END
            FROM postzon
    ORDER BY RANDOM()
    LIMIT 10000;

是否有像IGNORE或DROP或EXCLUDE这样的PostgreSQL运算符?

对于上面的每个查询,我尝试在SELECT语句之后包含以下行:

WHERE (osnrth1m IS NOT NULL OR oseast1m IS NOT NULL) 

但这似乎没有改变结果。

任何帮助都会感激不尽!

由于

1 个答案:

答案 0 :(得分:1)

您需要osnrth1moseast1m not null。这就是您应该使用and而不是or

的原因
WHERE (osnrth1m IS NOT NULL AND oseast1m IS NOT NULL)

查询是:

SELECT
        CONCAT_WS('_',osnrth1m,oseast1m)
    FROM postzon
    WHERE (osnrth1m IS NOT NULL AND oseast1m IS NOT NULL)
    ORDER BY RANDOM()
    LIMIT 10000;

如果还需要排除空osnrth1moseast1m值,则:

SELECT
            CONCAT_WS('_',osnrth1m,oseast1m)
        FROM postzon
        WHERE
            osnrth1m IS NOT NULL AND
            oseast1m IS NOT NULL AND
            osnrth1m <> '' AND
            oseast1m <> ''
        ORDER BY RANDOM()
        LIMIT 10000;