使用postgresql 9.3我可以选择JSON数据类型的特定字段,但是如何使用UPDATE修改它们?我在postgresql文档中或在线任何地方都找不到任何这样的例子.我试过了明显的事:
postgres=# create table test (data json);
CREATE TABLE
postgres=# insert into test (data) values ('{"a":1,"b":2}');
INSERT 0 1
postgres=# select data->'a' from test where data->>'b' = '2';
?column?
----------
1
(1 row)
postgres=# update test set data->'a' = to_json(5) where data->>'b' = '2';
ERROR: syntax error at or near "->"
LINE 1: update test set data->'a' = to_json(5) where data->>'b' = '2...
Run Code Online (Sandbox Code Playgroud) 我似乎无法DateTime::createFromFormat()
在PHP 7.0.26中工作
我的密码
date_default_timezone_set('America/New_York');
$t = '2018-02-23T11:29:16.434Z';
echo '$t: ' . json_encode($t) . PHP_EOL;
$f = DateTime::RFC3339_EXTENDED;
echo '$f: ' . json_encode($f) . PHP_EOL;
echo 'createFromFormat: ' . json_encode(DateTime::createFromFormat($f, $t)) . PHP_EOL;
echo 'getLastErrors: ' . json_encode(DateTime::getLastErrors()) . PHP_EOL;
$t = '2018-02-23T11:29:16.434+00:00';
echo '$t: ' . json_encode($t) . PHP_EOL;
echo 'createFromFormat: ' . json_encode(DateTime::createFromFormat($f, $t)) . PHP_EOL;
echo 'getLastErrors: ' . json_encode(DateTime::getLastErrors()) . PHP_EOL;
Run Code Online (Sandbox Code Playgroud)
输出:
$t: "2018-02-23T11:29:16.434Z"
$f: "Y-m-d\\TH:i:s.vP"
createFromFormat: false
getLastErrors: {"warning_count":0,"warnings":[],"error_count":2,"errors":{"20":"The format separator does not match","21":"The …
Run Code Online (Sandbox Code Playgroud) 任何人都可以看到为什么这不起作用?根据手册的第9.15节,->
操作员应该访问JSON数据类型的元素.它在我看来,虽然信息模式说列是类型'json'它仍然是一个标量字符串(注意它显示时的引号.)
postgres=# create table jtest (id serial, data json);
CREATE TABLE
postgres=# select column_name, data_type from information_schema.columns where table_name = 'jtest';
column_name | data_type
-------------+-----------
id | integer
data | json
(2 rows)
postgres=# insert into jtest (data) values (to_json('{"k1": 1, "k2": "two"}'::text));
INSERT 0 1
postgres=# select * from jtest;
id | data
----+--------------------------------
1 | "{\"k1\": 1, \"k2\": \"two\"}"
(1 row)
postgres=# select data->'k1' from jtest;
ERROR: cannot extract element from a scalar
postgres=# …
Run Code Online (Sandbox Code Playgroud) 我一定是遗漏了一些东西......似乎JSONB_SET()
不像宣传的那样工作?
SELECT JSONB_SET(
'{"k1": {"value": "v1"}}',
'{k2,value}',
'"v2"',
TRUE
);
Run Code Online (Sandbox Code Playgroud)
结果是:
----+------------------------
| jsonb_set
| jsonb
----+------------------------
1 | {"k1": {"value": "v1"}}
----+------------------------
Run Code Online (Sandbox Code Playgroud)
我期待{"k1": {"value": "v1"}, "k2": {"value": "v2"}}
我也尝试FALSE
作为第四个参数,以防它被逆转或其他什么。
我正在使用 PostgreSQL 9.6.4
首先我已经彻底检查了以下问题,这个问题似乎不是一回事:
这些似乎都归结为两件事:
<?xml?>
标签。encoding
与<?xml?>
标签中定义的不符。至于#1,我用 来检查我的文件xxd
,结果显示在此处:
$ xxd sample.fo
00000000: 3c3f 786d 6c20 7665 7273 696f 6e3d 2231 <?xml version="1
00000010: 2e30 2220 656e 636f 6469 6e67 3d22 5554 .0" encoding="UT
00000020: 462d 3822 3f3e 5465 7374 206d 6174 6572 F-8"?>Test mater
00000030: 6961 6c20 6963 6f6e 7354 6869 7320 746f ial iconsThis to
00000040: 7069 6320 7465 7374 7320 7468 6520 …
Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的 json
{
"elements": [ "element1", "element2", "element3" ]
}
Run Code Online (Sandbox Code Playgroud)
我想迭代它的元素并打印它们。我这样做
do $$
declare
datajson jsonb := '{
"elements": [ "element1", "element2", "element3", "element4" ]
}';
element varchar(128);
begin
foreach element in array jsonb_array_elements(datajson->'elements')
loop
raise notice '%', element;
end loop;
end;
$$;
Run Code Online (Sandbox Code Playgroud)
但它因错误而失败query select jsonb_array_elements(datajson->'elements') returned more than one row
。
问题是什么?
更新
尝试了这个建议:
do $$
declare
datajson jsonb := '{
"elements": [ "element1", "element2", "element3", "element4" ]
}';
element varchar(128);
begin
foreach element in array
SELECT array_agg(jsonb_array_elements) …
Run Code Online (Sandbox Code Playgroud) 这不起作用:
$ tar -cf /tmp/z.tar -C /space/myroot -s '/^\.svn\/patches/__patches' src .svn/patches
tar: Invalid regular expression: trailing backslash (\)
Run Code Online (Sandbox Code Playgroud)
也没有好处:
$ tar -cf /tmp/z.tar -C /space/myroot -s '/^\\.svn\\/patches/__patches' src .svn/patches
tar: Invalid replacement flag _
Run Code Online (Sandbox Code Playgroud)
反斜杠(最多 4 个)和引号的每种组合都会给我带来这两个错误之一。不过我知道第一个在 sed 中有效:
$ tar -cf /tmp/z.tar -C /space/myroot src .svn/patches
$ tar -tf /tmp/z.tar | sed 's/^\.svn\/patches/__patches/'
src/a.c
src/b.c
__patches/A.patch
__patches/B.patch
Run Code Online (Sandbox Code Playgroud)
我也知道我可以逃避并这样做:
$ tar -cf /tmp/z.tar -C /space/myroot -s '/^.svn.patches/__patches' src .svn/patches
Run Code Online (Sandbox Code Playgroud)
——但我真的不想这么做。 postgresql ×3
json ×2
apache-fop ×1
bash ×1
bsdtar ×1
datetime ×1
escaping ×1
jsonb ×1
php ×1
php-7 ×1
plpgsql ×1
saxon ×1
sql ×1
xml ×1
xml-parsing ×1