0

我有两张表,如下所示:

+----+----------------+-----------+-----+
| id | Catalog Number | Pack Size | Qty |
+----+----------------+-----------+-----+
|  1 | K353-J353-5    | 5 kg      |   3 |
|  2 | V3532-3        | 3 kg      |   2 |
|  3 | S32-366-10     | 10 kg     |   1 |
+----+----------------+-----------+-----+

+----+----------------+--------------+
| id | Catalog Number | Product Name |
+----+----------------+--------------+
|  1 | V353-J353      | a            |
|  2 | V3532          | b            |
+----+----------------+--------------+

我想加入这两个表,但不同的目录号格式给我带来了麻烦。目录号始终由“-”字符分隔,但可以有 0 或 1 个“-”。

我管理的唯一方法是通过Excel的文本到列功能,SQL中有没有等效的方法?

在此先感谢,迈克

4

2 回答 2

0

表时,在子句JOIN中使用 MySQL 函数是有效的:ON

SELECT * FROM
Table1
JOIN Table2
ON REPLACE(Table1.catalog_number, "-", "") = REPLACE(Table2.catalog_number, "-", "")

这将按 V35323 和 V3532-3 的目录号连接列,而不是按 V3532 和 V3532-3 的目录号。根据问题本身,这应该可以解决问题。不过,在查看数据时,我不太确定。

编辑

您的问题没有具体说明,但我认为您希望忽略第一个表中的最后一组数字,并将其与第二个表中未更改的目录号相匹配。如果这是真的,那么这将起作用:

SELECT * FROM
Table1
JOIN Table2
ON
REPLACE( SUBSTR(Table1.catalog_number, 1, LENGTH(Table1.catalog_number) - LENGTH(SUBSTRING_INDEX(Table1.catalog_number, "-", -1)) - 1), "-", "")
=
Table2.catalog_number;

这是疯狂的复杂,​​但它的伎俩:

mysql>     SELECT * FROM
    ->     Table1
    ->     JOIN Table2
    ->     ON
    ->     REPLACE( SUBSTR(Table1.catalog_number, 1, LENGTH(Table1.catalog_number) - LENGTH(SUBSTRING_INDEX(Table1.catalog_number, "-", -1)) - 1), "-", "")
    ->     =
    ->     Table2.catalog_number;
+----+----------------+-----------+------+----+----------------+--------------+
| id | catalog_number | pack_size | qty  | id | catalog_number | product_name |
+----+----------------+-----------+------+----+----------------+--------------+
|  2 | V3532-3        | 3 kg      |    2 |  2 | V3532          | b            |
+----+----------------+-----------+------+----+----------------+--------------+
1 row in set (0.02 sec)
于 2013-08-27T22:59:18.547 回答
0

尝试:

SELECT *
FROM Table1
JOIN Table2 ON Table2.`Catalog Number` LIKE CONCAT(Table1.Catalog Number, '%')
于 2013-08-27T23:07:29.313 回答