測定結果が決められた範囲内か判定する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 行)
必要であれば補足します。
では、よろしくお願いします。
お礼
ご回答ありがとうございます。 やはりDAOクラスになりますか。 > id = :id そういえば、こういうプレースホルダも使えるんですね。 普段、?を使っていたので、:name を利用することで、 多少分かりやすくなるかもしれません。 DAOクラスって、テーブルのスキーマをもう一回書かないといけない というイメージがありましたが、 http://symfony.xrea.jp/1.0/book/01-Introducing-Symfony.html#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%28ORM%29 を読んでいる限りでは、やはり便利そうですね。 Creole + Propel を勉強してみます。 (↑これって、PHPで、最もメジャーな組み合わせなんですか?) ありがとうございました。