SQL:将字符串函数存储在列上,稍后在where子句中使用



我们如何存储应用于列值的字符串函数的值,并稍后在where子句中使用它,例如:

select trim(lower(column)) as c from Table where c like '%pattern%' or c like '%pattern2%';

我不想在每个where...like子句中重复trim(lower(column)),而是想计算一次并如上所述使用它。上面的语句抛出了一个关于unknown column c的错误

这个问题已经被问了很多次,例如在MySQL查询的WHERE子句中使用列别名会产生错误

我会尽量通过描述我能想到的所有替代方案来增加价值。

您可以在WHERE子句中重复以下表达式:

select trim(lower(column)) as c from Table 
where trim(lower(column)) like '%pattern%' 
or trim(lower(column)) like '%pattern2%';

您可以在派生表子查询中定义别名,然后在外部查询中引用别名:

select c from (
select trim(lower(column)) as c from Table 
) as t
where c like '%pattern%' or c like '%pattern2%';

类似地,您可以使用CTE,但在这种情况下,它与派生表相比没有任何优势。

with cte(c) as (
select trim(lower(column)) from Table 
)
select c from cte
where c like '%pattern%' or c like '%pattern2%';

您可以使用HAVING子句。MySQL有一个非标准特性,支持在HAVING子句中引用别名。我通常不建议这样做,因为它可能在其他SQL品牌中不起作用,而且我更喜欢将HAVING仅用于筛选组的标准目的,而不是筛选行。

select trim(lower(column)) as c from Table 
having c like '%pattern%' 
or c like '%pattern2%';

您可以为所需的表达式定义一个生成的列,然后在WHERE子句中按名称使用生成的列:

alter table Table add column c varchar(...) as (trim(lower(column)));
select c from Table
where c like '%pattern%' or c like '%pattern2%';

我还将评论一下,不需要您的示例表达式。

可能不需要使用LOWER((,因为默认排序规则不区分大小写。

TRIM((可能也是多余的,因为您的示例中的模式是由通配符限定的。

因此,您可以简单地运行显示的查询:

select column from Table
where column like '%pattern%' or column like '%pattern2%';

你可能会问";哪种解决方案的性能最好"(每个人都会询问性能。(在本例中,答案是它们的性能都很差,因为LIKE条件具有前导通配符,因此查询无论如何都会进行表扫描。

最新更新