0

使用时我似乎无法让 SQL 工作LIKE

DELETE FROM `customer_numbers` 
WHERE number NOT LIKE (SELECT number FROM number_part)%

constomer_numbers如果number不包含在number_part表中,则基本上从表中删除所有行

示例:customer_numbers.number = 0559354544 和 number_part.number = 05593 - 它不应该删除它。但是如果 05593 不包含在customer_numbers.number然后从 customer_numbers 表中删除行.. 它应该匹配前 5 位数字number_part

4

5 回答 5

2

您不能将 not like 与列表一起使用(在大多数数据库中,我很确定这在 mysql 中是正确的)。

相反,您可以使用相关子查询:

DELETE FROM `customer_numbers`
WHERE not exists (SELECT number FROM number_part
                  where customer_numbers.number like concat(number, '%')
                 )
于 2012-06-01T18:24:35.537 回答
1

您的查询相当混乱。至少有两种方式:

  1. 您的子查询返回多行,但位于您期望单个结果的位置。

  2. 您需要引用您的 LIKE 字符串。

2 可能很容易修复。尝试:

... WHERE number LIKE CONCAT((SELECT ... LIMIT 1),'%');

不过,1确实是您的问题。如果您将子选择作为单个命令运行,我希望您会得到多行,对吗?您希望如何将数字列表(比如说,1, 2, 3, 4, 5)视为 LIKE 字符串的一部分?

我猜你希望的是类似的东西LIKE '1%' OR LIKE '2%' OR LIKE '3%'...,等等......不是吗?

无论如何,如果您能更准确地告诉我们您想要做什么,我们可能会帮助您更好地解决您的问题。

正如你的问题所言,我只能说: 它不是那样工作的。

于 2012-06-01T18:25:41.707 回答
1

您将字段命名为编号,但由于前导 0,它们似乎是字符值,所以我假设它们是字符字段。

如果您的部件号总是 5 个字符长,那么您可以执行以下操作:

DELETE FROM `customer_numbers` 
WHERE substring(number,1,5) NOT IN (SELECT number FROM number_part)
于 2012-06-01T19:11:38.237 回答
0
  1. 您不能对数字字段进行 LIKE。
  2. 您不能对不是 DISTINCT 的子选择进行相等。

您必须使用“IN”。

DELETE FROM `customer_numbers` WHERE number NOT IN (SELECT number FROM number_part)
于 2012-06-01T18:24:08.723 回答
0

像这样的东西怎么样:

DELETE FROM customer_numbers WHERE number NOT IN (SELECT number FROM number_part)
于 2012-06-01T18:24:30.663 回答