我的数据库表中的一个字段(符号)显示如下所示的URL:
arizona/flag
arizona/flower
arizona/flower2
arizona/bird
另一个数据库表(文章)包含内容,如下所示:
+----------+-----------------+-------------+
| State-ID | PostURL | Article |
+----------+-----------------+-------------+
| us-az | flag | (text) |
| us-az | flower | (text) |
| us-az | flower2 | (text) |
| us-az | bird | (text) |
| us-fl | flag | (text) |
+----------+-----------------+-------------+
所以我的数据库查询必须连接这两个表。我只是在第一个表(符号)PostURL中添加了一个新字段,其值为flag,flower,flower2等。
它有效,但它有点多余,我想简化我的表格。所以我意识到我可以简单地将这些表连接到Symbols.URL中每个值的第二段。
我当前的join子句看起来像这样:
LEFT JOIN articles ART ON ART.ID = Sym.IDArea AND ART.PostURL = Sym.DesigGen
我想将其更改为:
LEFT JOIN gs_articles_world_usa ART ON ART.ID = GS.IDArea AND ART.PostURL = [2nd segment in value from field Sym.URL]
因此,URL的佛罗里达/花和佛罗里达/花2的第二段的值将是花和 flower2 。
我知道如何在查询中提取值后使用Explode来隔离这些值。但有没有办法在初始查询中隔离这些值?换句话说,我可以在查询本身内使用Explode或其他一些函数吗?
答案 0 :(得分:1)
您可以使用LOCATE查找斜杠的位置,并使用SUBSTR在斜杠的位置后剪切字符串。
SUBSTR(Sym.URL, LOCATE('/', Sym.URL) + 1)
请注意LOCATE
将获取您要查找的第一个字符串的位置。上面的代码只有在Sym.URL
中总是有1个斜杠时才有效。
答案 1 :(得分:1)
在MySQL中没有本地方法可以做到这一点,但显然as this blog describes你可以创建自己的SPLIT_STR
函数。
首先,DB用户必须具有INSERT
权限才能创建该功能。接下来,通过将其作为查询运行来创建该函数:
CREATE FUNCTION SPLIT_STR(
x VARCHAR(255),
delim VARCHAR(12),
pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
delim, '');
完成后,您可以访问&使用以下语法的函数:
SELECT SPLIT_STR(string, delimiter, position);
所以使用你的例子 - 并且没有看到更大的MySQL查询 - 也许这样的事情会起作用:
SELECT SPLIT_STR(Sym.URL, '/', 2) as Split_Sym_URL from [table name];
我Split_Sym_URL
的命名只是我的选择。随意将其更改为适合您的其他任何内容。 [table name]
应该是您的表名。
然后您可以在Split_Sym_URL
中使用JOIN
,如下所示:
LEFT JOIN gs_articles_world_usa ART ON ART.ID = GS.IDArea AND ART.PostURL = Split_Sym_URL