Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL 9.5:使用LIKE时在每个结果行中返回匹配的搜索词_Sql_Postgresql - Fatal编程技术网

PostgreSQL 9.5:使用LIKE时在每个结果行中返回匹配的搜索词

PostgreSQL 9.5:使用LIKE时在每个结果行中返回匹配的搜索词,sql,postgresql,Sql,Postgresql,我有下面的SQL查询,它连接两个表并返回与给定搜索字符串匹配的项作为前缀。在本例中,搜索字符串是apple、banana和orange,但它们可以是任何内容,也可以是一个或多个。搜索字符串将始终被视为前缀,即将有一个尾随“%”,但没有前导“%” SELECT orders.orderid, orders.order_name, fields.item_name FROM public.workorder_fields AS fields LEFT JOIN public.worko

我有下面的SQL查询,它连接两个表并返回与给定搜索字符串匹配的项作为前缀。在本例中,搜索字符串是apple、banana和orange,但它们可以是任何内容,也可以是一个或多个。搜索字符串将始终被视为前缀,即将有一个尾随“%”,但没有前导“%”

SELECT
  orders.orderid,
  orders.order_name,
  fields.item_name
FROM public.workorder_fields AS fields 
LEFT JOIN public.workorder AS orders 
ON fields.orderid = orders.orderid
WHERE fields.item_name LIKE 'apple%'
      OR fields.item_name LIKE 'banana%'
      OR fields.item_name LIKE 'orange%';
该查询非常有效,并返回我期望的结果,这是一个如下所示的结果列表:

-- Current Query Results

1   "order 1"   "apple pie"
2   "order 2"   "apple juice"
5   "order 5"   "orange juice"
10  "order 10"  "banana split"
-- Desired Query Results

1   "order 1"   "apple pie"     "apple"
2   "order 2"   "apple juice"   "apple"
5   "order 5"   "orange juice"  "orange"
10  "order 10"  "banana split"  "banana"
我想弄清楚的是,是否有一种方法可以同时为每个结果行返回匹配的搜索字符串。例如,我希望上述结果如下所示:

-- Current Query Results

1   "order 1"   "apple pie"
2   "order 2"   "apple juice"
5   "order 5"   "orange juice"
10  "order 10"  "banana split"
-- Desired Query Results

1   "order 1"   "apple pie"     "apple"
2   "order 2"   "apple juice"   "apple"
5   "order 5"   "orange juice"  "orange"
10  "order 10"  "banana split"  "banana"
请注意,第四列显示了导致该行被视为匹配的搜索词

是否需要修改原始查询以返回用于查找结果中每一行的匹配项的搜索字符串

我不太确定如何描述我试图解决的问题,因此,如果此问题本应以不同的方式描述,或者在stackoverflow上已经很好地询问/解决,请提前道歉

谢谢你的帮助

用例可以完成这项工作

SELECT
  orders.orderid,
  orders.order_name,
  fields.item_name,
  CASE WHEN fields.item_name LIKE 'apple%' THEN 'apple'
       WHEN fields.item_name LIKE 'banana%' THEN 'banana'
       WHEN fields.item_name LIKE 'orange%' THEN 'orange'
  END as match
FROM public.workorder_fields AS fields 
LEFT JOIN public.workorder AS orders 
ON fields.orderid = orders.orderid
WHERE fields.item_name LIKE 'apple%'
      OR fields.item_name LIKE 'banana%'
      OR fields.item_name LIKE 'orange%';

除了案例答案之外,您还可以将查询转换为一系列UNION ALL语句,每个语句都有一个单独的筛选项_名称,如“orange%”等,并添加一个带有常量值的列,如“orange”中的match_值。您需要根据您的数据集测试执行时间,但这是另一种选择。谢谢您的建议。案例建议似乎很有效。谢谢!结果很好。