【问题标题】:FIND_IN_SET woth trim function for valuesFIND_IN_SET 带有值的修剪功能
【发布时间】:2018-10-29 10:47:31
【问题描述】:

我有一列包含一串以逗号分隔的值。我使用FIND_IN_SET 来查询此列,它可以正常工作,直到值和, 之间有空格。我无法控制输入。我发现唯一可行的解​​决方案是在FIND_IN_SET 函数内的列上运行REPLACE。不幸的是,这将删除所有空格并可能返回不希望的结果。

blow 示例将返回表中的两行,而不是仅返回第一行。

col1                  | col2      
carpet , foo, bar     | myVal1
abc, 123 , car pet    | myVal2

查询

SELECT FIND_IN_SET('carpet', REPLACE(col1, ' ', ''));

有没有办法限制它只修剪,的空间枯萎侧

【问题讨论】:

  • 你描述的问题匹配坏表设计时间来了解规范化..
  • 如果你可以访问 MySQL 服务器 8.0 版,你可以使用REGEXP
  • @RaymondNijland 我完全意识到有缺陷的设计。我的任务是在解决数据问题时提供临时解决方案
  • @MadhurBhaiya 我过去在 MySQL 中使用过 REGEX,发现它非常慢
  • “我过去在 MySQL 中使用过 REGEX,发现它非常慢”没有解决方案可以让它变得更快...... FIND_IN_SET 和 REGEXP 一样糟糕跨度>

标签: mysql


【解决方案1】:

您可以尝试用逗号替换 ,[ ][ ],

SELECT
    col1,
    col2,
    FIND_IN_SET('carpet', REPLACE(REPLACE(col1, ', ', ','), ' ,', ',')) AS output
FROM yourTable;

Demo

注意:此答案假定逗号周围最多有一个前导/尾随空格,并且您的实际数据本身不包含逗号。如果可以有任意数量的空格,则此答案将失败。在这种情况下,您真正​​需要的是正则表达式替换。 MySQL 8+ 确实支持这一点,但更好的办法是规范化您的数据并停止像这样存储 CSV 数据。

【讨论】:

  • 我认为如果两边有多个空格字符,这将不起作用
  • @MadhurBhaiya 是的,我在回答时就知道这一点,但我试图为我认为是确切问题的问题提供一个解决方案,但情况似乎并非如此。
  • 呃,我不舒服。
  • 谢谢 - 它很难看,但数据也是如此:/
猜你喜欢
  • 2011-05-29
  • 1970-01-01
  • 2017-01-08
  • 2020-08-19
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
相关资源
最近更新 更多