我们如何存储应用于列值的字符串函数的值,并稍后在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条件具有前导通配符,因此查询无论如何都会进行表扫描。