12

Postgresql の初心者として (私は自分のサイトを Heroku のみをサポートする 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 as l_user_id, l.geopoint_id as l_geopoint_id」という句が追加されました。どうやら postgres はフィールドが選択されていない順序句を好まないためです。しかし、私が今得たエラーは、エイリアシングもしていないように見えます。Postgres の経験がある人なら誰でも問題が分かりますか?

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

4

4 に答える 4

5

fuzzystrmatch の関数、特にレーベンシュタイン関数を使用して、この同じ問題に遭遇しました。文字列の距離で並べ替え、文字列の距離で結果をフィルター処理する必要がありました。私はもともと試していました:

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

しかし、もちろん、WHERE 句から "column"dist" does not exist" というエラーが発生しました。私はこれを試してみましたが、うまくいきました:

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)

"items" テーブル エイリアスが必要であり、dist 列エイリアスはステートメント内で一意であるため、外側の SELECT でアクセスできることに注意してください。少しファンキーで、PG でこのようにしなければならないことに驚きましたが、パフォーマンスに影響はないようで、満足しています。

于 2012-04-11T02:18:14.683 に答える
4

あなたが持っている:

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

あなたのクエリで。それは違法な構文です。パーツを削除すると (結合条件の 1 つである場合は= l2.user_id移動します)、動作するはずです。where

Update below 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
于 2009-10-29T18:20:13.353 に答える
1

「どうやらpostgresはフィールドが選択されていない注文句を好まないため、追加されました」

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

まったく真実ではありません。

=> SELECT id FROM t1 ORDER BY owner LIMIT 5;

ID

30 10 20 50 40 (5列)

于 2009-10-29T20:11:03.527 に答える