【问题标题】:Search rows of data within a column in SQL在 SQL 中的列中搜索数据行
【发布时间】:2012-01-07 18:31:05
【问题描述】:

好的 - 因为我似乎让人们对我的目标感到困惑,所以我将提供这个起点:

SELECT `car_data` FROM `parts` WHERE `car_data` LIKE '%|2011|ford|%'

此语句返回适用于 2011 年福特的每个零件的 car_data。其中 ONE 行如下所示:

61156|SUV|2003|FORD|EXCURSION||6.0L DIESEL V8||||
61156|SUV|2011|FORD|EXCURSION||6.0L DIESEL V8||||
61156|SUV|2005|FORD|EXCURSION||6.0L DIESEL V8||||
61156|Truck|2001|GMC|SIERRA 2500 HD||6.6L DIESEL V8||||
61156|Truck|2002|GMC|SIERRA 2500 HD||6.6L DIESEL V8||||
61156|Truck|2007|DODGE|RAM 3500 PICKUP|ST|5.9L DIESEL L6||||
61156|Truck|2007|DODGE|RAM 3500 PICKUP|TRX4|5.9L DIESEL L6||||
61156|Truck|2003|FORD|F-250 SUPER DUTY PICKUP||6.0L DIESEL V8||||
61156|Truck|2011|FORD|F-250 SUPER DUTY PICKUP||6.0L DIESEL V8||||
61156|Truck|2005|FORD|F-250 SUPER DUTY PICKUP||6.0L DIESEL V8||||

请注意,此特定部件也适用于其他汽车(大多数都适用)。上面我的 SQL 调用返回的每一行数据都会返回与上述数据类似的结果。 car_data 是一个包含上述所有数据的大文本字段。

我需要过滤显示的每一行数据,并仅显示 2011 年福特的车型(分隔文本中的第 5 列)。示例:

EXCURSION
F-250 SUPER DUTY PICKUP

【问题讨论】:

  • F-250 SUPER DUTY PICKUP KING RANCHF-250 SUPER DUTY PICKUP LARIAT 不是不同的型号,还是没关系?
  • 真正的答案是将其移动到规范化的数据库结构中。为什么你不能这样做?
  • @CharlesSprayberry - 这些都不重要。我只需要该特定分隔字段中的唯一模型。
  • @JakeFeasel - 不幸的是 - 这个数据库(不是我创建的)已经投入生产很长时间了,我们无法改变结构。
  • 即使您无法更改当前表的结构,也可能值得创建一个新表,其中包含该列中的数据以标准化形式。

标签: php mysql sql regex


【解决方案1】:

是的,正如 Jake Feasel 指出的那样,对数据进行标准化,或者:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(data, '|', 4),'|',-5) as model
FROM data
GROUP BY SUBSTRING_INDEX(SUBSTRING_INDEX(data, '|', 4),'|',-5)

【讨论】:

  • 这很接近 - 但它只返回整个列中分隔数据的第一行。它需要返回与我的搜索查询匹配的那些。这是一个示例: SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(value, '|', 4),'|',-5) 作为模型 FROM data_table WHERE value LIKE '%|2010|ford|%' GROUP BY SUBSTRING_INDEX(SUBSTRING_INDEX(value, '|', 4),'|',-5)
【解决方案2】:

您可以在 php 中执行此操作,例如将每一行拆分为一个数组,然后将其中的每个数组添加到一个数组中,然后根据您想要的列编写 som 递归函数排序,您将需要 uasort 函数。

【讨论】:

  • 是的 - 我知道我可以通过 PHP 运行它 - 但我更愿意尽可能多地塞进一条 SQL 语句中。最多可以有 2000 个条目。对于这些条目中的每一个 - 可能是 5000 行分隔数据(上面的示例)。
【解决方案3】:

我仍然不清楚您需要返回什么,但如果您只是想获得模型而不是“修剪”(因为缺乏更好的描述)那么

SELECT DISTINCT(model) FROM car_info;

然后借用@Uboonto的解决方案:

SELECT DISTINCT(SUBSTRING_INDEX(SUBSTRING_INDEX(car_data, '|', 4), '|', -5))) from car_info;

应该可以解决问题。

如果 MySQL 报错,那么你应该可以这样做:

SELECT DISTINCT(<not sure what the name would be>) FROM
    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(car_data, '|', 4), '|', -5)) from car_info;

【讨论】:

  • Karlson - 不幸的是,这不起作用。这个项目的最大问题是 car_info 实际上是列。我在原始帖子中发布的所有数据都是该列中的数据。它是由“|”分隔的一堆数据特点。一张假表。
【解决方案4】:

编辑 - MySQL

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(ci.data, '|', -7),'|',1) from 
(select distinct data from car_info)

【讨论】:

  • @Avisra:请检查此查询,我认为包含所有分隔文本的列是数据列,所以我选择离散数据,然后从该离散数据中选择模型
  • Guarav - 它在“with abc as”给我一个错误。 ABC 是我的表名还是只是一个参考? (我把它保留为 abc。我以为 car_info 是表名)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 2021-10-16
  • 2010-10-16
  • 2020-10-25
  • 1970-01-01
相关资源
最近更新 更多