Postgresql

如何選擇不為空的數組?

  • September 23, 2017

為什麼這如此棘手,令牌設置為它不等於 null 也不等於空字元串?

SELECT lexemes
FROM ts_debug('This is a title')
WHERE alias = 'asciiword';

lexemes 
---------
{}
{}
{}
{titl}
(4 rows)

好的..所以我想擺脫{},

SELECT lexemes
FROM ts_debug('This is a title')
WHERE alias = 'asciiword'
 AND lexemes <> '{}'
 AND lexemes <> ARRAY[]::text[]
 AND lexemes IS NOT NULL
 AND lexemes <> ARRAY[' ']
 AND lexemes <> ARRAY[null]::text[];

我知道其中大部分都行不通。,但我很困惑為什麼<> '{}'不工作<> ARRAY[]::text;。我如何過濾掉這個?

原因似乎是該列中的空字元串具有數組維度[1:0]。通常應該是NULL. 看:

SELECT lexemes, array_dims(lexemes) FROM ts_debug('a title');

lexemes | array_dims
---------+------------
{}      | [1:0]  -- !!
        |
{titl}  | [1:1]

空數組通常具有 NULL 作為數組維度。

SELECT '{}'::text[] AS test, array_dims('{}'::text[]);

test    | array_dims
---------+------------
{}      | <NULL>

因此,比較lexemes = '{}'::text[]返回FALSE。對我來說似乎是一個錯誤。我測試了 8.4 - 10 Beta 版本。它在所有版本中。

作為一種解決方法,排除所有空數組,包括奇數情況(和 NULL):

SELECT *
FROM   ts_debug('This is a title')
WHERE  cardinality(lexemes) > 0;

或者比較文本表示:

...
AND    lexemes::text <> '{}';

我送出了錯誤報告 #14826。

引用自:https://dba.stackexchange.com/questions/186715