场景:
假设我们有一个数据库表“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”?
我的伪代码不起作用:
Φ = (COLUMN_1<10) AND ((COLUMN_2=4) OR (COLUMN_3>5) OR NOT (COLUMN_4=0 AND TRUE))
Φ = FEATURE_X=1
SELECT "ID" FROM "TABLE" WHERE (COLUMN_1<10) AND ((COLUMN_2=4) OR (COLUMN_3>5) OR NOT (COLUMN_4=0 AND TRUE)))
这里的错误是,第一个sql查询并不总是返回一个超集,有时也返回一个空集,这意味着where子句中的逻辑表达式不会被保留。
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;
这就是我在我的场景中所做的。
看看这个直升机是否