2017-07-27 16 views
0

私はSQLを初めて使用していて、数値とテキストで構成される文字列(たとえば "10 Windows")を持つテーブルを持っています。 。このテーブルから、文字列から "10"を抽出し、それを整数として新しい列に移動する必要があります(私はpgAdmin4を使用しています)CASTとSUBSTRING(pgAdmin 4)を使用しているときにpostgresqlでクエリの結果をフィルタリングする方法

数字を解析するクエリを書くことができましたその文字列を整数として新しい列に返します。ここから

SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num 
FROM events 

、私は整数としてdata1_numという名前の列にDATA1内の文字列から数値を取得することができます。

しかし、以下のクエリでdata1_num = 27のすべての行を検索するためにフィルタリングすると、エラーが発生します。

SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num 
FROM events 
WHERE data1_num = 27 

エラー:

ERROR: column "data1_num" does not exist 
LINE 3: WHERE data1_num = 27 
     ^
********** Error ********** 

ERROR: column "data1_num" does not exist 
SQL state: 42703 
Character: 205 

私は何かが足りないのですか?

私はこれがうまくいくと思いますし、data1_numが27だった行がゼロであっても、エラーは発生しません。

答えて

0

postgresqlでどのようにクエリが解析されるかによって、エラーが発生しています。最初にwhere条件がチェックされ、次にby文とby文(もしあれば)によってグループ化され、最後に列のリストが選択されます。したがって、postgresはエイリアスを認識できません。

私はこれがあなたの望ましい結果与えるだろうと思う:

SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num 
FROM events 
WHERE SUBSTRING(data1 FROM '(\d+)') = '27' 
0

をこの列「data1_numは」仮想列であるので、あなたが結果を取得したい場合は、その後、あなたは同じキャストを記述する必要が動作しません。 where節のロジック。

SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num 
FROM events 
WHERE CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) = 27 
0

あなたSELECT句は、クエリで最初に表示された場合でも、それはWHERE句の後を評価され、実際にあります。これが標準のSQLです。つまり、SELECTの計算カラム(またはカラムエイリアス)にアクセスすることはできません。

ただ、この方法を試してください。

SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num 
FROM events 
WHERE CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) = 27 ; 

注:式が二度計算されて心配しないでください。それを最適化するのはデータベースに任されています。

それでも心配ならば

、あなたはこれを使用することができます。

SELECT 
    * 
FROM 
    (
     SELECT data1, CAST(SUBSTRING(data1 FROM '(\d+)') AS INTEGER) AS data1_num 
     FROM events 
    ) AS q 
WHERE data1_num = 27 ; 

参考文献:

関連する問題