mysql - SUBSTRING() 中不允许列值作为 pos 或 len ? (错误1054未知列)

标签 mysql sql database substring locate

我尝试了这个查询:

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

这样一来,可读性会更好,而不是将所有 LOCATE()CHAR_LENGTH() 直接放在 SUBSTRING() 中我认为最好不要计算 left_pos 两次。

但它返回:

[Err] 1054 - Unknown column 'left_pos' in 'field list'

SUBSTRING() 中不允许使用列值吗?因为这会产生正确的值:

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

最佳答案

该问题与 SUBSTRING() 本身无关。您不能在定义列别名的 SELECT 中使用列别名。 SQL(一般来说)不保证SELECT 中表达式的求值顺序。同样,SQL 不保证 SELECTWHERE 之前计算,因此相应的 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

关于mysql - SUBSTRING() 中不允许列值作为 pos 或 len ? (错误1054未知列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41939118/

相关文章:

ruby-on-rails - rails : query results are not updated after changing data in sqlite

mysql - 将多个表连接到单个 mysql 表中,为每条记录添加新字段

mysql - 如何在mysql中使用group by从表中获取最新数据?

sql - 我可以使用函数/表达式通过 T-SQL 中的 "As"语句命名列吗?

没有分组依据的 SQL Max(date)

sql - 删除 PostgreSQL 中索引的唯一性

php sql语法,获取带有id变量的随机行/包含行

sql - 加入时棘手的SQL

SQL - 右连接或子查询中存在的位置/位置

php - 如何使用 MySQL 获取最新日期