我正在尝试连接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)
但这似乎没有改变结果。
任何帮助都会感激不尽!
由于
答案 0 :(得分:1)
您需要osnrth1m
和oseast1m
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;
如果还需要排除空osnrth1m
和oseast1m
值,则:
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;