我正试图从一个具有两列的本地文件加载数据,其中一列没有直接插入,而是映射到查找表中的id。但是,我要查找的字符串包含一个下划线,它由LIKE
解释,不是所需的效果。
在进行普通查询时,我只会用_
转义_
,但由于它在用户变量中,我找不到如何直接转义此字符。举个例子,使用以下LOAD DATA
语句:
LOAD DATA
语句:
LOAD DATA INFILE 'file.csv' INTO TABLE my_table
FIELDS TERMINATED BY 't'
ESCAPED BY ''
LINES TERMINATED BY 'n'
(@foo, bar)
SET foo = (
SELECT id FROM lookup_table
WHERE foo_string
LIKE @foo
LIMIT 1
);
file.csv
STR_1 hi
STR_2 hey
表my_table
+--------+---------+-------+
| id | foo | bar |
+--------+---------+-------+
| 1 | 2 | hello |
| 2 | 1 | world |
+--------+---------+-------+
表lookup_table
+--------+------------+
| id | foo_string |
+--------+------------+
| 1 | STR_1 |
| 2 | STR_2 |
+--------+------------+
在这个例子中,@foo
被LIKE
解释为STR_1
,并且不会匹配任何条目,我希望它是STR_1
。
可以通过自己添加转义符来更改csv文件格式,但我想知道是否存在";"清洁剂";首先。
看起来是自动完成的。我认为这是我问题的罪魁祸首,但我还有一个完全没有看到的问题,在这里看不到,但我无论如何都会解释我做了什么。
在我的SQL查询中,我使用LOAD DATA INFILE ... (@foo, bar) SET foo_id = (SELECT ...)
,认为SET
会将foo_id
映射到表中相应的列。它实际所做的只是创建一个名为@foo_id
的未使用的用户变量。
这里的解决方案是在任何地方使用确切的列名作为用户变量,给出类似LOAD DATA INFILE ... (@foo_id, bar) SET foo_id = (SELECT ...)
的内容