【问题标题】:MySQL like excludeMySQL 喜欢排除
【发布时间】:2016-04-14 03:26:45
【问题描述】:

我有这样的记录:

  1. WW.FK
  2. WW.ZG., WW.FK.
  3. WW.ZS.、WW.ZG.、WW.FK.
  4. WW.ZS.

我想排除仅包含“FK”的记录并检索那些包含“Sk”以外但可以包含“SK”的记录

如果我使用查询

NOT LIKE '%WW.FK.%' 

我只得到

  1. WW.ZS.

我使用查询

t LIKE '%WW.__.%' AND t not like '%WW.FK.%'

我将排除所有包含 FK 的记录。

我想获得的记录:

  1. WW.ZG., WW.FK.
  2. WW.ZS.、WW.ZG.、WW.FK.
  3. WW.ZS.

解决办法是什么?

【问题讨论】:

    标签: mysql select sql-like


    【解决方案1】:

    我认为你应该删除百分号:

    `dual` NOT LIKE 'WW.FK'
    

    【讨论】:

    • 这是错误的。他需要百分号,因为他正在检查子字符串。
    • 但是如果他要删除的记录是确切知道的,并且等于 'WW.FK',那么一个简单的 NOT LIKE 'WW.FK' 就可以了。我是不是误会了什么?
    【解决方案2】:

    解决方案是停止将事物列表存储在字符串中。此列包含某种代码列表。它应该存储在一个联结表中,其中一列用于原始实体,另一列用于每个代码。列表应该(通常)存储为表中的行而不是分隔字符串。然后你可以很容易地表达你的查询。

    如果您对这种数据结构感到困惑,那么也许正则表达式会有所帮助。像这样的:

    where not col rlike '^([^,]*[.]FK(, )+)+.$'
    

    但是,尝试为您可能想要的每种条件找出正确的正则表达式实际上只是浪费工作,因为正确的数据结构使这变得容易得多。

    【讨论】:

    • 我知道我的结构不好,但我现在想以某种方式获取数据。我只想要包含 '%WW.__.%' 的记录
    【解决方案3】:

    您可以尝试使用子查询。

    SELECT 
      * 
    FROM
      `table_name` 
    WHERE t NOT IN 
      (SELECT 
       t 
      FROM
        `table_name` 
      WHERE t LIKE '%WW.FK%')
    

    【讨论】:

      猜你喜欢
      • 2016-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 2014-03-30
      • 2012-03-17
      • 2010-11-10
      • 2011-07-17
      相关资源
      最近更新 更多