SQL查询以查找可能包含特殊字符的部分字符串匹配

时间:2020-08-08 22:26:34

标签: sql mariadb

带有特殊字符()的SQL查询

original query(感谢GMB)可以找到地址(用户表)中地址(地址效果表)中匹配的任何项目。

如果地址包含','则查询工作正常,但如果地址字段中存在'()',我似乎无法使其正常工作。

这是不起作用的sql查询:

UPDATE users u 
SET u.COUNT = (
  SELECT COUNT(*) FROM address_effect a 
  WHERE FIND_IN_SET(a.address, REPLACE(u.address, ', ', ','')')) 
)

好,我正在使用XAMPP(使用MariaDB)在本地系统上对此进行测试。

我试图通过在其前面加上反斜杠''将'()'标识为转义字符,但这无济于事。

用户表

+--------+-------------+---------------+--------------------------+--------+
|    ID  |  firstname  |  lastname     |    address               |  count |
|        |             |               |                          |        |
+--------------------------------------------------------------------------+
|     1  |    john     |    doe        |james street, idaho, usa  |        |                    
|        |             |               |                          |        |
+--------------------------------------------------------------------------+
|     2  |    cindy    |   smith       |rollingwood av,lyn, canada|        |
|        |             |               |                          |        |
+--------------------------------------------------------------------------+
|     3  |    rita     |   chatsworth  |arajo ct, alameda, cali   |        |
|        |             |               |                          |        |
+--------------------------------------------------------------------------+
|     4  |    randy    |   plies       |smith spring, lima, (peru)|        |                       
|        |             |               |                          |        |
+--------------------------------------------------------------------------+
|     5  |    Matt     |   gwalio      |park lane, (atlanta), usa |        |
|        |             |               |                          |        |
+--------------------------------------------------------------------------+

address_effect表

+---------+----------------+
|address   |effect         |
+---------+----------------+
|idaho    |potato, tater   |
+--------------------------+
|canada   |cold, tundra    |
+--------------------------+
|fremont  | crowded        |
+--------------------------+
|peru     |alpaca          |
+--------------------------+
|atlanta  |peach, cnn      |
+--------------------------+
|usa      |big, hard       |
+--------+-----------------+

2 个答案:

答案 0 :(得分:2)

我建议为此使用正则表达式。似乎比摆弄字符串更笼统:

update users u
    set count = (select count(*)
                 from address_effect ae
                 where u.address regexp concat('[[:<:]]', ae.address, '[[:>:]]'))
                );

时髦的字符类是MySQL划定单词边界的方式(我更习惯\W,但MySQL不支持)。

Here是db <>小提琴。

答案 1 :(得分:1)

就像您用逗号替换每个逗号之后的空格一样,请使用REPLACE()删除字符'('')'

FIND_IN_SET(a.address, REPLACE(REPLACE(REPLACE(u.address, ', ', ','), '(', ''), ')', ''))

请参见demo
结果:

| ID  | firstname | lastname   | address                    | count |
| --- | --------- | ---------- | -------------------------- | ----- |
| 1   | john      | doe        | james street, idaho, usa   | 2     |
| 2   | cindy     | smith      | rollingwood av,lyn, canada | 1     |
| 3   | rita      | chatsworth | arajo ct, alameda, cali    | 0     |
| 4   | randy     | plies      | smith spring, lima, (peru) | 1     |
| 5   | Matt      | gwalio     | park lane, (atlanta), usa  | 2     |