我需要从MySQL列中提取文本,并将该文本复制到另一列。这篇文章将是第一列全文的摘录,因为我需要修剪15个前导字符,然后只包括接下来的140个+/-字符,并将该文本复制到一个新的列中。
当然,这可以将所有文本从一列复制到另一列:
UPDATE
表SET column1=column2
我看到函数LEFT和RIGHT从左边或右边修剪文本。
但是否可以将LEFT和RIGHT组合起来去掉前15个字符,然后复制下一个+或-140个字符
没有我可以使用的分隔符;所有的文本都会有所不同。所以我需要能够数字符。
当我说+或-140个字符时:有可能不打断一个可能以140结尾的单词吗?
更新11/27/13
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))));
这很有趣。我已经测试了你想要的东西。
更新
我已经测试过了。即使并没有空格,下面的查询也能很好地工作。你可以在这里测试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 |
+-----------------------------------------------------------------------------------------------------------------------+
这里有一个示例sqlFiddle示例
只需将数字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示例中一样,只需将3的出现次数替换为16(您的15+1),并将10的发生次数替换为140
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的证明这是代码:
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))));
您了解过在mySQL中使用LEFT、RIGHT和SUBSTRING运算符吗?你可以通过任何方式轻松抓取字符16。
UPDATE _table_ SET column1 = SUBSTRING(column2,16)
至于打断单词,你可能需要使用PHP。