我需要从MySQL列中提取文本并将该文本复制到另一列。本文将摘录第一栏中的全文,我需要修剪15个主要字符,然后仅包含文本的下一个140 +/-字符,并将该文本复制到新列。
当然,这可以将所有文本从一列复制到另一列:
UPDATE
表SET column1=column2
但是可以将LEFT和RIGHT组合去除前15个字符,然后复制下一个+或 - 140个字符吗?
我没有可以使用的分隔符;所有文字都会有所不同。所以我需要能够计算角色。
当我说+或 - 140个字符时:是否有可能不打破可能在140结束时结束的单词?
2013年11月27日更新
以下Jungsu Heo的查询有效且不会破坏名为wp2_posts
的表格以及post_excerpt
和post_content
列
UPDATE `wp2_posts`
SET post_excerpt = SUBSTRING(SUBSTRING(post_content, 55, 110), 1,
IF(LENGTH(SUBSTRING(post_content, 55, 110)) -
LENGTH(SUBSTRING_INDEX(SUBSTRING(post_content, 55, 110), ' ', -1)) = 0,
LENGTH(SUBSTRING(post_content, 55, 110)), LENGTH(SUBSTRING(post_content, 55, 110)) -
LENGTH(SUBSTRING_INDEX(SUBSTRING(post_content, 55, 110), ' ', -1))));
答案 0 :(得分:2)
很有趣。我测试了你想要的东西。
我已经测试过了。即使没有空格,下面的查询也能正常工作。你可以在这里测试sqlfiddle。 http://www.sqlfiddle.com/#!2/0bf19/2/1。 (不幸的是,我们无法在sqlfiddle中运行DML)
UPDATE tab SET cite = SUBSTRING(SUBSTRING(col, 16, 130), 1, IF(LENGTH(SUBSTRING(col, 16, 130)) - LENGTH(SUBSTRING_INDEX(SUBSTRING(col, 16, 130), ' ', -1)) = 0, LENGTH(SUBSTRING(col, 16, 130)), LENGTH(SUBSTRING(col, 16, 130)) - LENGTH(SUBSTRING_INDEX(SUBSTRING(col, 16, 130), ' ', -1))));
这是一步一步的例子:
set @str = 'ABC 1234 56789';
set @ltrim_len = 5;
set @ltrimmed_str = SUBSTRING(@str, @ltrim_len);
set @right_word_warp = SUBSTRING_INDEX(@ltrimmed_str, ' ', -1);
set @final_sub_len = LENGTH(@ltrimmed_str) - LENGTH(@right_word_warp);
SELECT SUBSTRING(@ltrimmed_str, 1, IF(@final_sub_len = 0, LENGTH(@ltrimmed_str), @final_sub_len)) AS cite;
+-------+
| cite |
+-------+
| 1234 |
+-------+
'ABC 12345 6789'给出,然后修剪'ABC'并修剪'6789'以获得精确的单词扭曲。最后我们得到'12345'。
这是我测试的内容。一步一步的例子。最后的答案是最后一个sql。
set @str = 'ABC 12345 6789';
SELECT @str;
+----------------+
| @str |
+----------------+
| ABC 12345 6789 |
+----------------+
SELECT SUBSTRING(@str, 5);
+--------------------+
| SUBSTRING(@str, 5) |
+--------------------+
| 12345 6789 |
+--------------------+
SELECT SUBSTRING_INDEX(SUBSTRING(@str, 5), ' ', -1);
+--------------------+
| SUBSTRING(@str, 5) |
+--------------------+
| 12345 6789 |
+--------------------+
SELECT LENGTH(SUBSTRING_INDEX(SUBSTRING(@str, 5), ' ', -1));
+------------------------------------------------------+
| LENGTH(SUBSTRING_INDEX(SUBSTRING(@str, 5), ' ', -1)) |
+------------------------------------------------------+
| 4 |
+------------------------------------------------------+
SELECT SUBSTRING(SUBSTRING(@str, 5), 1, LENGTH(SUBSTRING(@str, 5)) - LENGTH(SUBSTRING_INDEX(SUBSTRING(@str, 5), ' ', -1)) );
+-----------------------------------------------------------------------------------------------------------------------+
| SUBSTRING(SUBSTRING(@str, 5), 1, LENGTH(SUBSTRING(@str, 5)) - LENGTH(SUBSTRING_INDEX(SUBSTRING(@str, 5), ' ', -1)) ) |
+-----------------------------------------------------------------------------------------------------------------------+
| 12345 |
+-----------------------------------------------------------------------------------------------------------------------+
答案 1 :(得分:1)
这是一个例子sqlFiddle example
只需将数字2替换为15个前导字符,将数字10替换为140,它应该可以使用。它会删除前2个字符,然后找到10个字符并通过在末尾找到一个空格来删除最后一个字符。
UPDATE `table` SET column1=
LEFT( LEFT(RIGHT(column2,LENGTH(column2)-2),10),
10-
LOCATE(' ',REVERSE(LEFT(RIGHT(column2,LENGTH(column2)-2),10)),1)
);
或者你可以使用SUBSTRING
代替RIGHT
,就像在sqlFiddle example中一样,只需用16代替你的15(你的15 + 1)并用140替换10的出现
UPDATE `table` SET column1=
LEFT( LEFT(SUBSTRING(column2,3),10),
10-
LOCATE(' ',REVERSE(LEFT(SUBSTRING(column2,3),10)),1)
);
编辑:实际上,因为你想要一个单词以140结尾,你可能不得不用141替换10的出现,因为它丢弃了它找到的最后一个单词块,所以如果你的单词结束于140你不想要它下降所以尝试141.
-------------------------------------------
更新的的
以上答案是错误的,它不适用于其他情况。 以下新答案
这个答案有更多的案例来测试15(你的140)边界
这是sqlFiddle proof
这是代码:
UPDATE `table` SET column1=
IF(LENGTH(LEFT(SUBSTRING(column2,3),16)) < 16,
LEFT(SUBSTRING(column2,3),16),
LEFT(LEFT(SUBSTRING(column2,3),16),
LENGTH(LEFT(SUBSTRING(column2,3),16))-
LOCATE(' ',REVERSE(LEFT(SUBSTRING(column2,3),16)),1)
)
);
只需更改所有出现的3到16(您的15 + 1)和出现的16到141(您的140 + 1)。
-------------------------------------------------- -----------
回答最新的更新问题
UPDATE wp2_posts,
wp2_term_relationships,
wp2_term_taxonomy
SET post_excerpt = SUBSTRING(SUBSTRING(post_content, 55, 110), 1,
IF(LENGTH(SUBSTRING(post_content, 55, 110)) -
LENGTH(SUBSTRING_INDEX(SUBSTRING(post_content, 55, 110), ' ', -1)) = 0,
LENGTH(SUBSTRING(post_content, 55, 110)), LENGTH(SUBSTRING(post_content, 55, 110)) -
LENGTH(SUBSTRING_INDEX(SUBSTRING(post_content, 55, 110), ' ', -1))));
WHERE (wp2_posts.ID = wp2_term_relationships.object_id)
AND (wp2_term_relationships.term_taxonomy_id = wp2_term_taxonomy.term_taxonomy_id
AND wp2_term_taxonomy.taxonomy = 'category'
AND wp2_term_taxonomy.term_id = '213');
或者您希望保留所有INNER JOIN
语法,如下所示
UPDATE wp2_posts
INNER JOIN wp2_term_relationships
ON (wp2_posts.ID = wp2_term_relationships.object_id)
INNER JOIN wp2_term_taxonomy
ON (wp2_term_relationships.term_taxonomy_id = wp2_term_taxonomy.term_taxonomy_id
AND wp2_term_taxonomy.taxonomy = 'category'
AND wp2_term_taxonomy.term_id = '213')
SET post_excerpt = SUBSTRING(SUBSTRING(post_content, 55, 110), 1,
IF(LENGTH(SUBSTRING(post_content, 55, 110)) -
LENGTH(SUBSTRING_INDEX(SUBSTRING(post_content, 55, 110), ' ', -1)) = 0,
LENGTH(SUBSTRING(post_content, 55, 110)), LENGTH(SUBSTRING(post_content, 55, 110)) -
LENGTH(SUBSTRING_INDEX(SUBSTRING(post_content, 55, 110), ' ', -1))));
答案 2 :(得分:0)
您是否了解过mySQL中LEFT,RIGHT和SUBSTRING运算符的用法?您可以通过任何方式轻松抓取角色16.
UPDATE _table_ SET column1 = SUBSTRING(column2,16)
至于破词,你可能不得不使用PHP。