【问题标题】:SQL query to find a partial string match that could include special characters用于查找可能包含特殊字符的部分字符串匹配的 SQL 查询
【发布时间】:2020-08-08 22:26:34
【问题描述】:

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

original query(非常感谢GMB)可以在地址(users 表)中找到与地址(address_effect 表)匹配的任何项目。

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

这是不工作的 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       |
+--------+-----------------+

【问题讨论】:

  • 如果您的表格设计正确,您将不会遇到此类问题。在列中存储以逗号分隔的值列表几乎总是表明数据库设计不佳。

标签: sql mariadb


【解决方案1】:

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

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

funky character class 是 MySQL 划定单词边界的方式(我更习惯\W,但 MySQL 不支持)。

Here 是一个 dbfiddle。

【讨论】:

  • 我可以看到查询在 dbfiddle 中工作,但不理解逻辑。 - 在第一个查询中将值分配给计数的目的是什么。 - 这个表达式是如何工作的: where u.address regexp concat('([^a-zA-Z]|^)', ae.address, '([^a-zA-Z]|$)') )
  • @IshuVerma 。 . .这将检查users 中地址的单词与address_effect 中的名称之间是否匹配。
  • 谢谢@GordonLinoff。在第一个查询中为计数列分配值的目的是什么。
  • @IshuVerma 。 . .这使您可以在运行 update 之前验证结果。
【解决方案2】:

就像用逗号替换每个逗号后的空格一样,使用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     |

【讨论】:

  • 这个查询有效,但我意识到如果数据不干净,即如果缺少逗号或使用另一个字符作为分隔符,那么这种方法将不起作用。我更喜欢@GordonLinoff 查询,因为无论分隔符如何,它都能找到字符串的任何匹配项。
  • 此代码适用于您发布的要求。
  • 是的,绝对符合我发布的要求。谢谢。
猜你喜欢
  • 2020-12-25
  • 2013-02-25
  • 1970-01-01
  • 2022-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2021-09-29
  • 2011-02-19
相关资源
最近更新 更多