【发布时间】:2015-04-22 20:36:57
【问题描述】:
我有一个名为Stores 的表,其中有一个名为store_id 的键和一个名为Sales 的表,其中包含一个store_id 引用和一个名为sales_json 的json 字段。
sales_json 看起来像这样:
[{'start_date': '2-20-15', 'end_date': '2-21-15', 'start_time': '11:00 AM',
'end_time': '11:00 PM', 'discount_percentage': 20}, etc]
我有一个 plpgsql 函数,我在其中尝试确定商店当前是否有销售,并根据是否为真在结果表中存储一个名为 having_sale 的布尔值。
我的 SELECT 语句如下所示:
SELECT Stores.store_id,
CASE WHEN (SELECT COUNT(*)
FROM (SELECT *
FROM json_array_elements(sales_json) AS sale
WHERE (now()::date BETWEEN (sale->>'start_date')::date AND
(sale->>'end_date')::date) AND
(now()::time BETWEEN (sale->>'start_time')::time AND
(sale->>'end_time')::time)
) AS current_sales) > 0
THEN TRUE
ELSE FALSE
END) AS having_sale
FROM Stores INNER JOIN Sales
ON Stores.store_id = Sales.store_id;
代码在我看来是正确的,但我收到以下错误:
psycopg2.DataError: cannot extract field from a non-object
我做错了什么,我该如何解决?
【问题讨论】:
-
一个或多个 sales_json 数组中的某些元素可能不是真正的对象? IE。你能在里面有任何空值吗?
-
嗨,我正在使用上面的
sales_json值进行测试,它不包含任何空值。 -
好吧,上面的查询中有一个额外的括号,但除此之外,使用上面描述的测试数据对我来说效果很好 - 请参阅sqlfiddle.com/#!15/59fd7/2 - 所以我认为它有事情要做与您的输入数据。我可以得到该错误消息的唯一方法是将一个空数组插入其中一个 sales_json 条目,例如:sqlfiddle.com/#!15/e70fa/1
-
这很奇怪,我使用的输入与适合您的输入完全相同,但仍然没有骰子:\
-
您的 sqlfiddle 代码对我有用,但我使用类似但更复杂的表并通过 psycopg 的代码由于某种原因不起作用。它可能与 json 输入的类型转换有关,因为它从 python 调用到我的函数中。
标签: arrays json postgresql python-2.7 psycopg2