mysql - 在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 时,它遇到了同样的问题。
谁能帮我解决这个问题?
解决方案
列名最长为 64 个字符,但您的CONCAT
表达式(默认情况下,它成为子查询中的列名)超过了这个值。
您可以在其后放置AS path
(或类似名称),为该列提供一个固定的短名称。
推荐阅读
- docker - 在 Docker Toolbox for Windows 中挂载 USB 卷
- raspberry-pi - 如何在树莓派 3 上使用 lirc 解码原始 IR 数据
- php - 从 wordpress 插件覆盖 $wp_customize
- postgresql - 使用 ISNULL 更新和操作
- r - 使用 14 天和 7 天的间隔计算 90 个百分位数并用 R 组中的中位数替换它
- javascript - 刷新后无法获取用户详细信息 oAuth(护照 npm)
- laravel - Laravel 社交名流,护照不受支持的授权类型
- git - 开始使用 git(在 TFS 之后)
- web - Tuleap 安装错误
- c++ - 从 C++ 中的位表示初始化字符