質問

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 ...
                                                             ^

... query:

   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

clause" l.user_id as l_user_id、l.geopoint_id as l_geopoint_id"明らかにpostgresは選択されていないフィールドを持つ順序句を好まないため追加されました。しかし、私が今得たエラーは、私がエイリアスを取得していないように見えます。 postgresの経験がある人なら誰でも問題を見ることができますか?

これらの問題が多数発生する可能性があります-クエリはmySqlで正常に機能しました...

役に立ちましたか?

解決

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

  

各式は nameまたは   出力の序数   列 (SELECTリストアイテム)、またはそれ   形成される任意の式を指定できます   入力列の値から。

したがって、式が使用されている場合、エイリアスはありません。

他のヒント

次のものがあります:

order by l2.geopoint_id, l_user_id = l2.user_id desc
クエリの

。それは違法な構文です。 = l2.user_id 部分を削除し(それが結合条件の1つである場合は where に移動します)、動作するはずです。

更新以下のselect( = 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

fuzzystrmatchの関数、特にlevenshtein関数を使用して、この同じ問題に遭遇しました。ストリング距離でソートし、ストリング距離で結果をフィルター処理する必要がありました。元々試していた:

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

しかし、もちろん、「列」「dist」というエラーが表示されました。存在しません&quot; WHERE句から。私はこれを試してみましたが、うまくいきました:

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

しかし、WHERE句にはその資格が必要でした。この質問の他の誰かは、WHERE句がORDER BYの前に評価されるため、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)

&quot; items&quot;テーブルエイリアスは必須であり、dist列エイリアスはステートメント内で一意であるため、外部SELECTでアクセスできます。少しファンキーで、PGでこのようにしなければならないことに驚いていますが、パフォーマンスが低下することはないので満足しています。

&quot;が追加されました。明らかに、postgresはフィールドが選択されていない順序句を好まないためです

&quot; order byに関する限り-はい、PostgresQL(および他の多くのデータベース)では、select句にリストされていない列による順序付けは許可されていません。

単なる真実ではありません。

=&gt; t1からIDを選択して、所有者の制限5で並べ替えます。

id

30  10  20  50  40 (5行)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top