首页 > 解决方案 > 在mysql中同时使用concat和substring/substring_index时出现SQL错误1166

问题描述

我在mysql中同时使用concat和substring_index时遇到了一个奇怪的错误,我的代码在这里

CREATE TEMPORARY TABLE candidate (ori int, dest int, myPath varchar(500), depth int ) as (
    select transforms.ori, baseTransforms.dest, concat(substring_index(baseTransforms.road,',',-1),',',substring_index(transforms.road,',',1)), 2
    from transforms, baseTransforms
    where transforms.dest=baseTransforms.ori and transforms.ori <> baseTransforms.dest);

定义在这里

create table baseTransforms(
    ori int,
    dest int,
    road varchar(500)
);
create table transforms(
    ori int,
    dest int,
    road varchar(500)
);

并且baseTransform的数据是这样填充的

insert into baseTransforms select * from transforms;

然后我得到

错误代码:1166. 列名不正确 'concat(substring_index(baseTransforms.road,',',-1),',',substring_index(transforms.road,',',1))'

但是当我通过删除我的 substring_index 阶段来修改代码时,它不会引发错误,即

CREATE TEMPORARY TABLE candidate (ori int, dest int, myPath varchar(500), depth int ) as (
        select transforms.ori, baseTransforms.dest, concat(',',substring_index(transforms.road,',',1)), 2
        from transforms, baseTransforms
        where transforms.dest=baseTransforms.ori and transforms.ori <> baseTransforms.dest);

CREATE TEMPORARY TABLE candidate (ori int, dest int, myPath varchar(500), depth int ) as (
        select transforms.ori, baseTransforms.dest, concat(substring_index(baseTransforms.road,',',-1),','), 2
        from transforms, baseTransforms
        where transforms.dest=baseTransforms.ori and transforms.ori <> baseTransforms.dest);

两者都很好,所以实际上两个列名都是正确的,这太令人困惑了。

ps 当我尝试使用 substring 函数而不是 substring_index 时,它遇到了同样的问题。

谁能帮我解决这个问题?

标签: mysql

解决方案


列名最长为 64 个字符,但您的CONCAT表达式(默认情况下,它成为子查询中的列名)超过了这个值。

您可以在其后放置AS path(或类似名称),为该列提供一个固定的短名称。


推荐阅读