RailsでPostgreSQLのArray型で、配列が空のものを取得する方法


RailsでPostgreSQLのArray型を使った時に、配列が空のもののみを取得するにはどうすればいいでしょうか。

例えば、次のコードのようにpreload_article_idsが配列型(Integer)だとして、次のようなコードを書けば取得できるのかなと思いました。

[code]

    Article.where("array_length(preload_article_ids, 1) = 0")
    
[/code]

しかし、実際には取得することが出来ませんでした。どうすれば空の場合のみ取得できるか、ご教授頂けませんでしょうか。よろしくお願い致します。



[code]

    array_length('{}'::int[], 1)
    
[/code]

は0ではなくNULLを返すんですね。(試してみて今気付きました)

なので、

[code]

    Article.where("array_length(preload_article_ids, 1) IS NULL")
    
[/code]

とNULL検査にするか、

[code]

    Article.where("preload_article_ids = '{}' OR preload_article_ids IS NULL")
    
[/code]

と空配列と比較(と必要であればNULL検査)にするか、PostgreSQL9.4以降ですが、`cardinality`関数は空配列に対して0を返すとマニュアルに書いてある(試してません)ので

[code]

    Article.were("cardinality(preload_article_ids) = 0")
    
[/code]

とこれを使うかでしょうか。



[code]

    array_length('{}'::int[], 1)
    
[/code]

は0ではなくNULLを返すんですね。(試してみて今気付きました)

なので、

[code]

    Article.where("array_length(preload_article_ids, 1) IS NULL")
    
[/code]

とNULL検査にするか、

[code]

    Article.where("preload_article_ids = '{}' OR preload_article_ids IS NULL")
    
[/code]

と空配列と比較(と必要であればNULL検査)にするか、PostgreSQL9.4以降ですが、`cardinality`関数は空配列に対して0を返すとマニュアルに書いてある(試してません)ので

[code]

    Article.were("cardinality(preload_article_ids) = 0")
    
[/code]

とこれを使うかでしょうか。

