測定結果が決められた範囲内か判定するSQL文
決められた範囲内に測定結果が入っているかを判定するSQL文(またはストアドプロシージャ)を
PostgreSQL 14.0を使って作ろうとしていますが、正しい結果が得られません。
具体的には、ケーブル・テーブルとスペック・テーブルで一致するテスト項目同士(例えば、'Test_1'同士)だけを比較したいのですが、他のテスト項目も引っ掛けてしまいます。
あと、下記のwhere test_item = 'Test_1', 'Test_2', 'Test_3'の部分を
select test_item from cable;
から一つ一つ取り出してループで回して代入し、最終的には
id | test_item | test
----+-----------+------
1 | Test_1 | 1.5
2 | Test_1 | 1.8
2 | Test_2 | 2.5
という、まとまった出力を得たいのですが、その方法を教えていただけないでしょうか?
自作のテーブルとSQL文は以下になります:
create table cable(
id integer default 0 not null
,test_item varchar(30) not null
,test numeric(3, 1)
,primary key (id, test_item)
);
insert into cable values(1, 'Test_1', 1.5);
insert into cable values(1, 'Test_2', 4.5);
insert into cable values(1, 'Test_3', 2.5);
insert into cable values(2, 'Test_1', 1.8);
insert into cable values(2, 'Test_2', 2.5);
insert into cable values(3, 'Test_3', 2.5);
create table spec(
test_item varchar(30) not null
, lower_spec numeric(3, 1)
, upper_spec numeric(3, 1)
, primary key(test_item)
);
insert into spec values('Test_1', 1.0, 2.0);
insert into spec values('Test_2', 2.0, 3.0);
insert into spec values('Test_3', 3.0, 4.0);
postgres=# select * from cable c WHERE c.test_item = test_item and test < (select upper_spec from spec where test_item = 'Test_1') and test > (select lower_spec from spec where test_item = 'Test_1');
id | test_item | test
----+-----------+------
1 | Test_1 | 1.5
2 | Test_1 | 1.8
(2 行)
postgres=# select * from cable c WHERE c.test_item = test_item and test < (select upper_spec from spec where test_item = 'Test_2') and test > (select lower_spec from spec where test_item = 'Test_2');
id | test_item | test
----+-----------+------
1 | Test_3 | 2.5 ←'Test_3'なので引っ掛けたくない
2 | Test_2 | 2.5
3 | Test_3 | 2.5 ←'Test_3'なので引っ掛けたくない
(3 行)
postgres=# select * from cable c WHERE c.test_item = test_item and test < (select upper_spec from spec where test_item = 'Test_3') and test > (select lower_spec from spec where test_item = 'Test_3');
id | test_item | test
----+-----------+------
(0 行)
必要であれば補足します。
では、よろしくお願いします。
お礼
できました。ありがとうございました。 pa.options_id IN ('1','2','4') という書き方もあるのですね。