Postgres的列别名问题(postgres column alias problem)

2019-09-02 08:43发布

作为一个新手到PostgreSQL(我动过,因为我感动我的网站的Heroku谁只支持它,我有重构我的一些疑问和代码。下面是我不能完全理解的问题的问题有:

PGError: ERROR:  column "l_user_id" does not exist
LINE 1: ...t_id where l.user_id = 8 order by l2.geopoint_id, l_user_id ...
                                                             ^

...查询:

   select distinct 
          l2.*, 
          l.user_id as l_user_id, 
          l.geopoint_id as l_geopoint_id 
     from locations l 
left join locations l2 on l.geopoint_id = l2.geopoint_id 
    where l.user_id = 8 
 order by l2.geopoint_id, l_user_id = l2.user_id desc

加入条款“l.user_id为l_user_id,l.geopoint_id为l_geopoint_id”因为很明显Postgres的确不喜欢与不选择的字段顺序条款。 但错误我现在得到使它看起来像我还没有得到混淆。 任何人只要有Postgres的经验看这个问题?

我可能有一帮这样的问题 - 查询在MySQL工作得很好...

Answer 1:

在PostgreSQL你不能为了使用表达的别名。 只有平原的别名在那里工作。 您的查询应该是这样的:

   select distinct 
          l2.*, 
          l.user_id as l_user_id, 
          l.geopoint_id as l_geopoint_id 
     from locations l 
left join locations l2 on l.geopoint_id = l2.geopoint_id 
    where l.user_id = 8 
 order by l2.geopoint_id, l.user_id = l2.user_id desc;

我假设你的意思是l2.user_id=l.user_id应该先走。

这是相关信息的PostgreSQL-general邮件列表上。 以下是在的文档ORDER BY子句 :

每个表达式可以是名称或输出列的序数 (选择列表项),或者它可以是输入列值构成任意表达式

当使用表达式因此,没有别名。



Answer 2:

你有:

order by l2.geopoint_id, l_user_id = l2.user_id desc

在您的查询。 这是非法的语法。 删除= l2.user_id部分(将其移动到where ,如果这是的加盟条件之一者),它应该工作。

更新下选择(与= l2.user_id删除)应该工作得很好。 我上的Postgres 8.3进行了测试(使用不同的表/列名,很明显)

select distinct 
       l2.*, 
       l.user_id as l_user_id, 
       l.geopoint_id as l_geopoint_id 
  from locations l 
  left join locations l2 on l.geopoint_id = l2.geopoint_id 
 where l.user_id = 8 
 order by l2.geopoint_id, l_user_id desc


Answer 3:

我跑进使用功能从fuzzystrmatch同样的问题 - 尤其是莱文斯坦功能。 我需要筛选结果既排序字符串距离,经串并距离。 我本来想:

SELECT thing.*, 
levenshtein(thing.name, '%s') AS dist 
FROM thing 
WHERE dist < character_length(thing.name)/2 
ORDER BY dist

但是,当然,我得到了错误“列” DIST“不存在”,从WHERE子句。 我想这和它的工作:

SELECT thing.*, 
(levenshtein(thing.name, '%s')) AS dist 
FROM thing 
ORDER BY dist

但是我需要有在WHERE子句中那个资格。 有人在这个问题别人说,以前ORDER BY,因此列​​是不存在的,当它评估的WHERE子句WHERE子句进行评估。 通过咨询去,我想通了,一个嵌套的SELECT语句的伎俩:

SELECT * FROM 
(SELECT thing.*, 
     (levenshtein(thing.name, '%s')) AS dist 
     FROM thing 
     ORDER BY dist
) items 
WHERE dist < (character_length(items.name)/2)

请注意,“项目”表的别名是必需的,DIST列别名是在外部选择,因为它在声明中独特的访问。 这是一个有点古怪,我很惊讶,它必须是这样的PG - 但它似乎并没有采取打让我很满意的表演。



Answer 4:

“加入,因为显然Postgres的确不喜欢与不选择的字段顺序条款”

“至于为了通过老话 - 是的,PostgreSQL的(和许多其他数据库)不允许排序由未在SELECT子句中列出的列”

只是普通的不真实。

=> SELECT ID FROM T1 ORDER BY所有者LIMIT 5;

ID

30 10 20 50 40(5行)



文章来源: postgres column alias problem