问题描述:

我想读取sql表中一列中的数据并清理其值。
它实际上应该仅具有长度为9的“数字”。
当前为varchar(11),其值包含:A:123456789、1-2:3456789、123456789H,A-123456789等。

如何为表的不同值添加多个检查,并替换不正确的值并更新我的表。

我试图纠正搜索功能以检查是否包含的值是:,-

SELECT budget, descp
FROM yearlybudget
WHERE CONTAINS(budget, '":" OR "-");

SELECT budget, descp
FROM yearlybudget
WHERE CONTAINS(budget, '":" AND "-");

UPDATE dbo.yearlybudget
SET    budget = replace(budget, '":"', '""')
WHERE CONTAINS(budget, '":");


上面是3个不同的SQL语句。无论如何,我是否可以合并“ OR”和“ AND”条件检查?另外,如何添加替换以检查所有条件?

最好针对每种情况分别进行处理吗?

请指教。
谢谢。

最佳答案

首先,这些查询不会执行您认为的操作。最大的问题是有两个单引号,它们一起组成一个字符串。因此,您的前两个查询实际上是在检查字符串":" OR "-"); SELECT budget, descp FROM YearlyBudget WHERE CONTAINS(budget,是否存在。

其次,在contains中执行":" OR "-"不会同时检查这两个字符串。而是将字符串评估为数字,然后将其与二进制OR组合。具体来说,它们的计算结果为0,然后0或0将给您0,因此您要检查CONTAINS(budget,0)。

第三,您的替换不是替换:,而是":"。因此,除非用双引号将其括起来,否则它不会替换:字符。

第四,我的Google搜索表明MySQL没有“ CONTAINS”关键字。

您可能想要的查询看起来像这样:

UPDATE dbo.yearlybudget
SET budget = REPLACE(REPLACE(budget,'-',''), ':', '')
WHERE budget LIKE '%:%' OR budget LIKE '%-%';


LIKE字符串中的%表示“在此匹配任何字符”,因此完成了CONTAINS在某些其他数据库管理系统上所做的相同操作。因此,此查询将通过删除所有-和:字符来更新预算列,我认为这是您想要的。如果您想做一些不同的事情,您可能应该说些什么。例如,如果您只想获取不带:或-的预算列版本,则应使用其他查询,因为该查询实际上会更改数据库中的数据。在执行此操作之前,请确保从预算列中删除-,因为这有可能使负预算变为正数,这可能是一个问题。

要回答有关是否可以将OR和AND结合的原始问题,答案可能是,但这取决于您要执行的操作。 OR不是唯一的,所以当A = 1和B = 1时,A = 1或B = 1将为真。

关于mysql - SQL NESTED查询以清除不良数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8915479/

10-09 00:25
查看更多