2017-01-30 10 views
0

私はこのクエリを試してみました:SUBSTRING()では、posまたはlenとして列の値を使用できません。 (エラー1054不明列)

SELECT 
    CHAR_LENGTH(
     '{start_123}' 
    ) AS start_len, 
    CHAR_LENGTH(
     '{end_123}' 
    ) AS end_len, 
    LOCATE(
     '{start_123}', 
     text 
    ) AS left_pos, 
    LOCATE(
     '{end_123}', 
     text 
    ) AS right_pos, 
    SUBSTRING(text, left_pos + start_len, right_pos - left_pos - end_len) AS text_part 
FROM 
    texts 
WHERE 
    id = 1 

可読性がずっと良い代わりに直接SUBSTRING()の内側にすべてLOCATE()CHAR_LENGTH()を置くのだろうと私はそれを計算するのではない方が良いと考えていたことにより、 left_pos

しかし、それが返されます。

[のErr] 1054 - 'フィールドリスト'

不明な列 'left_pos' は、SUBSTRING()で列の値を使用することはできませんか?このため、1つの結果正しい値:

SELECT 
    CHAR_LENGTH(
     '{start_123}' 
    ) AS start_len, 
    CHAR_LENGTH(
     '{end_123}' 
    ) AS end_len, 
    LOCATE(
     '{start_123}', 
     text 
    ) AS left_pos, 
    LOCATE(
     '{end_123}', 
     text 
    ) AS right_pos 
FROM 
    texts 
WHERE 
    id = 1 
+0

。列エイリアスは、それらが定義されている同じ 'select '(または' where')で使用することはできません。 SQLは 'select'で式の評価の順序を保証しません。式を繰り返すか、サブクエリを使用する必要があります。 –

答えて

1

は問題がSUBSTRING()自体とは何の関係もありません。列エイリアスは、定義されているSELECTには使用できません。 SQL(一般的に)は、SELECTの式の評価順序を保証しません。同様に、SQLはWHEREの前にSELECTが評価されることを保証しないので、対応するWHEREにもエイリアスは許可されません。

サブクエリは、おそらくこのような場合にはそれほど悪くないです:正しい

SELECT t.*, 
     SUBSTRING(text, left_pos + start_len, right_pos - left_pos - end_len) AS text_part 
FROM (SELECT CHAR_LENGTH('{start_123}') AS start_len, 
      CHAR_LENGTH('{end_123}') AS end_len, 
      LOCATE('{start_123}', text) AS left_pos, 
      LOCATE('{end_123}', text) AS right_pos 
     FROM texts 
     WHERE id = 1 
    ) t 
関連する問題