如何从逻辑上提取WHERE子句条件的一部分并稍后在SQL查询之外执行?

问题描述 投票:0回答:1

场景:

假设我们有一个数据库表“TABLE”,其中的实体由“ID”标识。每个实体都有多个存储在列(“COLUMN_1”到“COLUMN_N”)中的特征。实体“FEATURE_X”还有一个不在数据库中的附加功能。

带有 WHERE 子句的 SQL 查询根据涉及列和“FEATURE_X”的条件过滤实体。

现在我们不能在访问数据库的查询的实际条件中包含“FEATURE_X”,因为该功能不是由数据库中的列表示,而是由非常慢的算法确定。

问题:

我想将逻辑条件分成两部分。一种仅涉及列以便发送到数据库,一种条件涉及“FEATURE_X”。

我想构造一个查询来检索形成实际结果集超集的实体,以便我可以使用已预过滤的潜在结果实体集启动非常慢的算法。

是否有一个逻辑运算可以确保无论逻辑表达式如何,我们总是得到一个超集?

示例:

给出一个表达式

Φ = (COLUMN_1<10) AND ((COLUMN_2=4) OR (COLUMN_3>5) OR NOT (COLUMN_4=0 AND FEATURE_X=1))

SQL 语句如下所示:

SELECT ... FROM ... WHERE Φ

如何在不影响结果正确性的情况下排除“FEATURE_X”?

我的伪代码不起作用:

  1. 识别Φ_数据库
    Φ = (COLUMN_1<10) AND ((COLUMN_2=4) OR (COLUMN_3>5) OR NOT (COLUMN_4=0 AND TRUE))
  2. 识别 Φ_feature_x
    Φ = FEATURE_X=1
  3. 构建SQL查询
    SELECT "ID" FROM "TABLE" WHERE (COLUMN_1<10) AND ((COLUMN_2=4) OR (COLUMN_3>5) OR NOT (COLUMN_4=0 AND TRUE)))
  4. 将结果作为慢速算法的输入并得到结果。

这里的错误是,第一个sql查询并不总是返回一个超集,有时也返回一个空集,这意味着where子句中的逻辑表达式不会被保留。

sql logic expression logical-operators set-theory
1个回答
0
投票
SET @table_name = 'your_table_name';

SET @column_name = 'your_column_name';


SET @sql = IF(
(SELECT COUNT(*) 
 FROM information_schema.columns

 WHERE table_schema = DATABASE()

 AND table_name = @table_name

 AND column_name = @column_name) > 0,

 CONCAT('SELECT * FROM ',@table_name, 
 ' WHERE ', @column_name, ' IS NOT NULL AND id > 980'),

CONCAT('SELECT * FROM ', @table_name, ' WHERE id > 980'));

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

这就是我在我的场景中所做的。

看看这个直升机是否

© www.soinside.com 2019 - 2024. All rights reserved.