0

我在 SQL 方面是全新的,现在已经在这里工作了 6 个小时,现在可以使用。我一定错过了一些简单的东西。简而言之:我想根据数据库中另一个表中的部分匹配字符串删除 Wordpress 数据库中的帖子。

这是我到目前为止所得到的。它应该解释我正在尝试做的事情:

CASE
WHEN option_value FROM wp_options LIKE '%domain.com%'
THEN DELETE FROM wp_posts WHERE post_title = 'uniqueID'
ELSE DELETE FROM wp_posts WHERE post_title = 'XXXXXXXXXX'
END

ELSE 和 X 的存在是为了确保在它们不匹配时不会发生任何变化。

我错过了什么?:-)

@Dan Bracuk 这是成功的最终代码:

DELETE FROM wp_posts
WHERE post_title = 
CASE
WHEN (SELECT option_value FROM wp_options WHERE option_value LIKE '%domain.com%' LIMIT 1) LIKE '%domain.com' THEN 'UniqueID'
ELSE 'XXXXXXX' 
END
4

4 回答 4

0

您的 sql 语法无效。它必须类似于:

 delete from wp_posts
 where post_title = 
 case 
 when (subquery to get data from option_value table) like '%domain.com%' then 'uniqueId'
 else 'XXXXXXX' 
 end

但是,最好不要在这里使用 case 构造。我会做这样的事情:

 delete from wp_posts
 where 
 (post_title = 'uniqueId'
 and somefield in
 (select somefield 
 from option_value
 where wp_options like '%domain.com%'
 )
 )
 or
 (post_title = 'XXXXXX'
 and somefield in
 (select somefield 
 from option_value
 except
 select somefield 
 from option_value
 where wp_options like '%domain.com%'
 )
 )

请注意,一些数据库使用单词减号而不是 except,而另一些则根本不支持该语法。但是,这为您提供了总体思路。

于 2013-07-05T13:59:22.927 回答
0

你可以试试这样的,我相信它会有所帮助

IF ((SELECT COUNT(*) FROM wp_options  WHERE post_title LIKE '%uniqueID%'))
  BEGIN
    DELETE FROM wp_posts WHERE post_title = 'uniqueID'
  END
ELSE
    BEGIN
     DELETE FROM wp_posts WHERE post_title  = 'XXXXXXXXXX'
END
于 2013-07-05T13:56:21.730 回答
0

如果没有更多的上下文,很难给出明确的答案。但是,从最初查看您的代码开始,假设它需要遵守标准 SQL 语法,则需要从以下行更新

option_value FROM wp_options LIKE '%domain.com%'

WHEN EXISTS(SELECT 1 FROM wp_options WHERE option_value LIKE '%domain.com%')

希望有帮助!

于 2013-07-05T13:29:48.620 回答
0

这将为您工作:

IF EXISTS (SELECT option_value FROM wp_options WHERE option_value LIKE '%domain.com%')
BEGIN
    DELETE FROM wp_posts WHERE post_title = 'uniqueID'
END

你不需要 ELSE,如果 ELSE 只是什么都不做:)

于 2013-07-05T14:07:38.170 回答