我正在使用Google Cloud SQL. I托管的MYSQL数据库,正在通过MySQL Workbench 8.0 CE进行操作。

我想要获取架构projects中表p0999_pakbonelement_name列的子字符串。 元素名称类似于"LVLS 45 Beam 1"和"SPANO 18 Stud 1"。我想得到:"LVLS 45"和"SPANO 18"

在本地计算机上托管的数据库的旧副本中,以下代码可以正常运行:

SELECT REGEXP_SUBSTR(pp.element_name, "[A-Z]+[:space:][0-9]+")
FROM projects.p0999_pakbon pp

这是因为REGEXP_SUBSTR是在MySQL中获取子字符串的标准函数。 但是,此代码在Google Cloud SQL托管的数据库中不起作用。在此页面https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#regexp_extract上,我似乎读到Google Cloud SQL改用REGEXP__EXTRACT。但是当我尝试以下操作时:

SELECT REGEXP_EXTRACT(pp.element_name, "[A-Z]+[:space:][0-9]+")
FROM projects.p0999_pakbon pp

这没用。当我将正则表达式更改为非常简单的"A"这样的正则表达式时,它也不起作用。

我收到这些错误:
FUNCTION项目。REGEXP_SUBSTR不存在
FUNCTION项目。REGEXP_EXTRACT不存在

当我以错误的格式键入参数时,出现以下错误消息:
调用存储功能“ REGEXP_EXTRACT”中的参数不正确

有人知道如何解决我的问题吗?也许有解决方法?

分析解答

假设您只需要前两个单词,则可以在此处使用SUBSTRING_INDEX,它应该适用于大多数版本的MySQL:

SELECT SUBSTRING_INDEX('LVLS 45 Beam 1', ' ', 2) AS item
FROM yourTable;

如果还需要断言第一个术语包含大写字母,第二个数字,则可以使用REGEXP

SELECT
    CASE WHEN 'LVLS 45 Beam 1' REGEXP '^[A-Z]+ [0-9]+'
         THEN SUBSTRING_INDEX('LVLS 45 Beam 1', ' ', 2)
         ELSE 'no match' END AS item
FROM yourTable;