我尝试了这个查询:
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 不保证 SELECT
在 WHERE
之前计算,因此相应的 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/