【问题标题】:Select Like and if found, add a column showing the results选择喜欢,如果找到,添加一列显示结果
【发布时间】:2014-09-15 21:05:10
【问题描述】:

对于我的问题中缺少信息,我深表歉意。我正在使用 MS SQL。我正在文本字段中查找 3 个特定项目; IH-、MPC 或 ICC。如果在文本字段中找到这些项目中的任何一个,我想表明它们已被找到。如果在第一行中找到了所有三个,则会有一个包含 IH-、MPC、ICC 的字段 这是我的查询;

SELECT     tt.TITLE, tt.ITEM_REFERENCE_ID, tt.VERSION, PATH_MAPPINGS.PATH, tt.CONTENT
FROM         ITEM_REFERENCES INNER JOIN
PATH_MAPPINGS ON ITEM_REFERENCES.ORGANIZATIONAL_ITEM_ID = PATH_MAPPINGS.ORGANIZATIONAL_ITEM_ID INNER 
JOIN
ITEMS AS tt INNER JOIN

                      (SELECT     ITEM_REFERENCE_ID, MAX(VERSION) AS MaxVersion
FROM          ITEMS
                        GROUP BY ITEM_REFERENCE_ID) AS groupedtt ON tt.ITEM_REFERENCE_ID = groupedtt.ITEM_REFERENCE_ID AND tt.VERSION = groupedtt.MaxVersion ON
ITEM_REFERENCES.ID = tt.ITEM_REFERENCE_ID

WHERE    (tt.CONTENT LIKE  '%<text>AP[0-2]%'  )
or

(tt.CONTENT LIKE  '%<text>IH-[0-2]%'  )
or

(tt.CONTENT LIKE  '%<text>MPC[0-2]%'  )
or
(tt.CONTENT LIKE  '%<text>ICC[0-2]%'  )

【问题讨论】:

  • 在我看来,这应该是脚本化的。 MySQL 根本无法自行动态添加列。您可以遍历所有列IF(title LIKE ..., 1, 0) AS matched_on_title, etc..
  • 为什么需要这个,不就是把所有的选项都加进去,然后在你的脚本里做个布尔比较吗?

标签: sql-server select text sql-like


【解决方案1】:

使用仅包含内容的简化数据表 一个想法是创建一个临时表来保存搜索条件,以根据原始数据检查它们。

临时表可以是CTE,如下查询所示

WITH ContentPattern AS (
  SELECT '%blue%' c
  UNION ALL
  SELECT '%red%'
  UNION ALL
  SELECT '%at%'
  UNION ALL
  SELECT '%green%'
  UNION ALL
  SELECT '%orange%'
)
SELECT a.[field], f.Found
FROM   Table1 a
       CROSS APPLY (SELECT STUFF((SELECT ', ' + cp.c
                                  FROM   ContentPattern cp 
                                  WHERE  PATINDEX(cp.c, a.[field]) > 0
                                  GROUP BY cp.c
                                  HAVING COUNT(cp.c) > 0
                                  FOR XML PATH(''), TYPE
                                 ).value('.', 'NVARCHAR(MAX)') 
                                 , 1, 1, '') Found) f

SQLFiddle demo

在问题中,模式具有可变部分,更改 CTE 的值就足够了,但还可以做更多事情:获取实际值而不是搜索条件。为此,我们需要模式的长度,而获得它的最简单方法是……以某种方式预先计算它,并将其添加到临时表/CTE

WITH ContentPattern AS (
  SELECT '%blue[0-2]%' c, 5 l
  UNION ALL
  SELECT '%red[0-2]%', 4 
  UNION ALL
  SELECT '%at[0-2]%', 3
  UNION ALL
  SELECT '%green%', 5
  UNION ALL
  SELECT '%orange%', 6
)
SELECT a.[field], f.Found
FROM   Table1 a
       CROSS APPLY (
             SELECT STUFF((
                    SELECT ', ' 
                         + SUBSTRING(a.[field], PATINDEX(cp.c, a.[field]), cp.l)
                    FROM   ContentPattern cp 
                    WHERE  PATINDEX(cp.c, a.[field]) > 0
                    GROUP BY cp.c, cp.l
                    HAVING COUNT(cp.c) > 0
                    FOR XML PATH(''), TYPE
                  ).value('.', 'NVARCHAR(MAX)') 
                  , 1, 1, '') Found) f

SQLFiddle demo

由于该字段在查询中,即使没有内容具有搜索模式,它也会出现在结果中,NULL 值,FoundLEN 上的 WHERE 条件@字段可以删除所有不匹配的行。

【讨论】:

  • 对于信息的缺乏,我深表歉意。我正在使用 MS SQL,实际上我正在尝试搜索可能包含三个选项中的任何一个的文本字段; IH-、MPC 或 ICC。这是我到目前为止的代码;
  • 我试图弄清楚如何使用我最近在我的问题中添加的查询来完成这项工作。这就是我正在寻找的东西。你看过我现有的代码了吗?
  • 是的,这就是我想要的。此外,我在原始问题中提供了带有所需搜索条件的示例查询。你能看到吗?感谢您的帮助
  • 是的,我看到了你的查询,但我更喜欢用一个简化的例子来指出方法,我会更新答案
  • 看起来它会起作用。唯一的问题是我现在不知道如何使用我的查询进行这项工作。我将不得不使用它。这需要一段时间。谢谢
【解决方案2】:
Select Case When FIELD Like '%BLUE%' Then 'BLUE'
       Else When FIELD Like '%RED%' Then 'RED'
       Else When FIELD Like '%AT%' Then 'AT' End
From Table
Where (FIELD Like '%BLUE%'
      Or FIELD Like '%RED%'
      Or FIELD Like '%AT%')

【讨论】:

    【解决方案3】:

    Postgres:

    select 
      (blue like '%blue%') as found_blue,
      (blue like '%red%') as found_red 
    from (select '***blue***'::text as blue) t;
    
     found_blue │ found_red 
    ────────────┼───────────
     t          │ f
    (1 row)
    

    MySql:

    select    
     (blue like '%blue%') as found_blue,   
     (blue like '%red%') as found_red  
     from (select '***blue***' as blue) t;
    +------------+-----------+
    | found_blue | found_red |
    +------------+-----------+
    |          1 |         0 |
    +------------+-----------+
    1 row in set (0.02 sec)
    

    【讨论】:

      猜你喜欢
      • 2014-04-21
      • 2020-11-04
      • 1970-01-01
      • 2018-07-15
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 2013-09-29
      相关资源
      最近更新 更多