使用两个变量查找唯一值
Look for a unique value using two variables
我需要通过为每一行使用 REFERENCE
和 LOCALISATION
变量来实现 ISSUES
列,并在 Table_issues_Localisation
.
上存储唯一值
问题是,这两个变量组成了一个二维 table,所以我必须动态 select LOCALISATION
的右列。
下面是我需要对图像执行的操作的说明。很抱歉张贴图片,但我认为这样更容易理解。
我尝试进行查询以逐行更新 Table_Observation.ISSUES
列,其中包含存储在 [=14= 的可变列 (=SELECT(SELECT))) 中的信息].
在Table_Observation.ROW_NUMBER
列表示每一行的数量。它用于循环。
DO $$
DECLARE
my_variable TEXT;
BEGIN
FOR i IN 1..35 LOOP
my_variable = SELECT((SELECT LOCALISATION FROM Table_Observation WHERE Table_Observation.ROW_NUMBER = i) FROM Table__issues_Localisation ON Table_Observation.REFERENCE = Table__issues_Localisation.REFERENCE)
UPDATE Table_Observation
SET ISSUES = my_variable
WHERE Table_Observation.ROW_NUMBER = i
END LOOP;
END;
$$
Postgres 版本 9.4
希望我说得够清楚,
您不需要 PL/pgSQL 或循环。你可以用一个更新语句来做到这一点:
update observation o
set issues = row_to_json(il) ->> o.localisation
from issues_localisation il
where il.reference = o.reference;
这要求 observation.localisation
中的值准确映射到 issues_localisation 中的列名。
有以下测试数据:
create table observation
(
rn integer primary key,
reference integer,
localisation text,
issues text
);
create table issues_localisation
(
reference integer,
issues_12 text,
issues_17 text,
issues_27 text,
issues_34 text
);
insert into observation (rn, reference, localisation)
values
(1, 27568, 'issues_27'),
(2, 6492, 'issues_34'),
(3, 1529, 'issues_34'),
(4, 1529, 'issues_34'),
(5, 709, 'issues_12');
insert into issues_localisation (reference, issues_12, issues_17, issues_27, issues_34)
values
(29, 'FB', 'FB', 'TFB', null),
(506, 'M', null, 'M', null),
(709, 'TF', null, null, null),
(1234, null, 'TF', 'TF', null),
(1529, 'FB', 'FB', 'FB', 'M'),
(3548, null, 'M', null, null),
(6492, 'FB', 'FB', 'FB', null),
(18210, 'TFB', null, 'TFB', 'TFB'),
(27568, 'TF', null, 'TF', 'TF');
更新将在 table 观察中产生此数据:
rn | reference | localisation | issues
---+-----------+--------------+-------
1 | 27568 | issues_27 | TF
2 | 6492 | issues_34 |
3 | 1529 | issues_34 | M
4 | 1529 | issues_34 | M
5 | 709 | issues_12 | TF
在线示例:http://rextester.com/OCGFM81609
对于你的下一个问题,你应该按照我在回答中所做的方式提供示例数据(和预期输出)。
我也从 table 名称中删除了完全无用的前缀 table_
。即horrible naming convention。
还有一个动态的例子(未完成,还需要执行)sql:
CREATE FUNCTION bagger (_name text) RETURNS text
AS
$func$
DECLARE upd text;
BEGIN
upd := format('
UPDATE observation dst
SET issues = src.%I
FROM issues_localisation src
WHERE src.reference = dst.reference
AND dst.localisation = %L
;', _name, _name);
-- RAISE NOTICE upd;
RETURN upd;
END
$func$
LANGUAGE plpgsql
;
-- SELECT bagger('issues_12' );
WITH loc AS (
SELECT DISTINCT localisation AS loc
FROM observation
)
SELECT bagger( loc.loc)
FROM loc
;
我需要通过为每一行使用 REFERENCE
和 LOCALISATION
变量来实现 ISSUES
列,并在 Table_issues_Localisation
.
问题是,这两个变量组成了一个二维 table,所以我必须动态 select LOCALISATION
的右列。
下面是我需要对图像执行的操作的说明。很抱歉张贴图片,但我认为这样更容易理解。
我尝试进行查询以逐行更新 Table_Observation.ISSUES
列,其中包含存储在 [=14= 的可变列 (=SELECT(SELECT))) 中的信息].
在Table_Observation.ROW_NUMBER
列表示每一行的数量。它用于循环。
DO $$
DECLARE
my_variable TEXT;
BEGIN
FOR i IN 1..35 LOOP
my_variable = SELECT((SELECT LOCALISATION FROM Table_Observation WHERE Table_Observation.ROW_NUMBER = i) FROM Table__issues_Localisation ON Table_Observation.REFERENCE = Table__issues_Localisation.REFERENCE)
UPDATE Table_Observation
SET ISSUES = my_variable
WHERE Table_Observation.ROW_NUMBER = i
END LOOP;
END;
$$
Postgres 版本 9.4
希望我说得够清楚,
您不需要 PL/pgSQL 或循环。你可以用一个更新语句来做到这一点:
update observation o
set issues = row_to_json(il) ->> o.localisation
from issues_localisation il
where il.reference = o.reference;
这要求 observation.localisation
中的值准确映射到 issues_localisation 中的列名。
有以下测试数据:
create table observation
(
rn integer primary key,
reference integer,
localisation text,
issues text
);
create table issues_localisation
(
reference integer,
issues_12 text,
issues_17 text,
issues_27 text,
issues_34 text
);
insert into observation (rn, reference, localisation)
values
(1, 27568, 'issues_27'),
(2, 6492, 'issues_34'),
(3, 1529, 'issues_34'),
(4, 1529, 'issues_34'),
(5, 709, 'issues_12');
insert into issues_localisation (reference, issues_12, issues_17, issues_27, issues_34)
values
(29, 'FB', 'FB', 'TFB', null),
(506, 'M', null, 'M', null),
(709, 'TF', null, null, null),
(1234, null, 'TF', 'TF', null),
(1529, 'FB', 'FB', 'FB', 'M'),
(3548, null, 'M', null, null),
(6492, 'FB', 'FB', 'FB', null),
(18210, 'TFB', null, 'TFB', 'TFB'),
(27568, 'TF', null, 'TF', 'TF');
更新将在 table 观察中产生此数据:
rn | reference | localisation | issues
---+-----------+--------------+-------
1 | 27568 | issues_27 | TF
2 | 6492 | issues_34 |
3 | 1529 | issues_34 | M
4 | 1529 | issues_34 | M
5 | 709 | issues_12 | TF
在线示例:http://rextester.com/OCGFM81609
对于你的下一个问题,你应该按照我在回答中所做的方式提供示例数据(和预期输出)。
我也从 table 名称中删除了完全无用的前缀 table_
。即horrible naming convention。
还有一个动态的例子(未完成,还需要执行)sql:
CREATE FUNCTION bagger (_name text) RETURNS text
AS
$func$
DECLARE upd text;
BEGIN
upd := format('
UPDATE observation dst
SET issues = src.%I
FROM issues_localisation src
WHERE src.reference = dst.reference
AND dst.localisation = %L
;', _name, _name);
-- RAISE NOTICE upd;
RETURN upd;
END
$func$
LANGUAGE plpgsql
;
-- SELECT bagger('issues_12' );
WITH loc AS (
SELECT DISTINCT localisation AS loc
FROM observation
)
SELECT bagger( loc.loc)
FROM loc
;