Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用动态WHERE语句创建SQL查询_Sql_Postgresql - Fatal编程技术网

使用动态WHERE语句创建SQL查询

使用动态WHERE语句创建SQL查询,sql,postgresql,Sql,Postgresql,我使用Postgresql作为我的数据库,以防万一,尽管我希望找到一种纯SQL方法,而不是特定于Postgresql的实现 我有一大组从制造一件电子产品中获得的测试数据,我想获取这组数据,并从中提取出在测试过程中符合特定标准的单元,理想情况下使用一个单独的表,其中包含每个制造步骤的测试标准 作为一个简单的例子,假设我在测试的两个不同步骤中检查单元的温度读数。在步骤1中,温度应在20C-30C范围内,而步骤2应在50C-60C范围内 让我们假设下面的表结构包含一组示例数据(表名“test_data

我使用Postgresql作为我的数据库,以防万一,尽管我希望找到一种纯SQL方法,而不是特定于Postgresql的实现

我有一大组从制造一件电子产品中获得的测试数据,我想获取这组数据,并从中提取出在测试过程中符合特定标准的单元,理想情况下使用一个单独的表,其中包含每个制造步骤的测试标准

作为一个简单的例子,假设我在测试的两个不同步骤中检查单元的温度读数。在步骤1中,温度应在20C-30C范围内,而步骤2应在50C-60C范围内

让我们假设下面的表结构包含一组示例数据(表名“test_data”):

让我们假设下表包含上述通过标准(表名“criteria”):

目前,使用静态方法,我可以使用以下查询:

    SELECT * FROM test_data  WHERE       
  ( test_data.step = 1 AND test_data.temperature > 20 AND test_data.temperature < 30 ) OR   
  ( test_data.step = 2 AND test_data.temperature > 50 AND test_data.temperature < 60 );
我希望使我的select查询更具动态性,而不是从静态定义开始,让它从test_criteria表的结果列表中构造自己。希望将其扩展为一个复杂的查询,例如,可以在步骤1中检查温度、电压和电流,但在步骤2中只检查电流


谢谢你的洞察力

您可以使用表之间的联接进行求解

SELECT t.*
FROM test_data  t
INNER JOIN criteria c ON t.step =  c.step 
  AND t.temperature > c.temperature_upper 
      AND t.temperature < c.temperature_lower

在表之间使用联接,
ON(test\u data.step=criteria.step)和(test\u data.temperature-between-criteria.temperature\u lower和criteria.temperature\u upper)
    SELECT * FROM test_data  WHERE       
  ( test_data.step = 1 AND test_data.temperature > 20 AND test_data.temperature < 30 ) OR   
  ( test_data.step = 2 AND test_data.temperature > 50 AND test_data.temperature < 60 );
temperature   step   serial_number
    25          1        1
    55          2        1
SELECT t.*
FROM test_data  t
INNER JOIN criteria c ON t.step =  c.step 
  AND t.temperature > c.temperature_upper 
      AND t.temperature < c.temperature_lower
SELECT t.*
FROM test_data  t
INNER JOIN criteria c ON t.step =  c.step 
  AND t.temperature netween c.temperature_upper AND  c.temperature_lower