21014


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

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

[code]

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

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


CC BY-SA 3.0
2016-01-17T02:31:00.693
20988
2016-01-18T01:27:35.810
12662
question
ruby-on-rails ruby postgresql
RailsでPostgreSQLのArray型で、配列が空のものを取得する方法

[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]

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


CC BY-SA 3.0
2016-01-18T01:27:35.810
21014
2016-01-18T01:27:35.810
5793
20988
answer