我有一個User帶有 jsonb 列的模型email_triggers。
電子郵件觸發器是一系列鍵值對,其結構類似于{"email_one": "3/1/22", "email_two": "4/9/22", email_three: null}
我想找到至少其中一個值是的所有用戶null
我一直在嘗試將 jsonb 物件轉換為值陣列,然后詢問該陣列中是否包含 null
User.where("array[jsonb_each(email_triggers.value)] @> null")
編譯為
SELECT "users".* FROM "users" WHERE (array[jsonb_each(email_triggers.value)] @> null) ORDER BY "users"."id" ASC LIMIT $1
但我收到未定義的表錯誤
PG::UndefinedTable: ERROR: missing FROM-clause entry for table "email_triggers" (ActiveRecord::StatementInvalid) LINE 1: ...CT "users".* FROM "users" WHERE (array[jsonb_each(email_trig...
我什至不確定這是否是正確的方法,但目標是嘗試搜索物件中的所有值以查看是否有任何空值。
注意:我也嘗試了 a_horse_with_no_name 的建議解決方案,但沒有回傳所需的結果
uj5u.com熱心網友回復:
- null的正確JSON表示形式
null不是"nil". email_triggers.value表示表格的value列email_triggers。
您可以使用jsonb_each將物件轉換為表,與它連接,查找值為null(JSON null,而不是 SQL null),并僅選擇不同的 ID。
select
distinct id
from users, jsonb_each(email_triggers)
where value = 'null';
email_triggers如果您存盤為陣列,這可以變得更簡單,您不妨使用標準日期格式。例如:["2022-03-01", "2022-04-09", null]
現在它是一個簡單的@>(包含)搜索。
Users.where("email_triggers @> 'null'")
最后,這將更快,并且與 Rails 作為普通連接表一起使用會更好。
您可以強制使用正確的date型別存盤日期并轉換為 Ruby Date 物件。
class User << ApplicationRecord do
has_many :email_triggers
end
# create_table(:email_triggers) do |t|
# belongs_to :user, foreign_key: true
# t.date :trigger_at, null: false
# end
class EmailTrigger << ApplicationRecord do
belongs_to :user
end
搜索現在是一個簡單的連接。
Users.join(:email_triggers).where(trigger_at: nil)
但是,如果您不允許空值,則現在不需要此搜索。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/491798.html
標籤:轨道上的红宝石 红宝石 PostgreSQL jsonb
上一篇:Springboot-org.postgresql.util.PSQLException:致命:用戶“postgres”的密碼驗證失敗
下一篇:將二維陣列取消嵌套到表中
