2014-09-15 2 views
1

Приносим извинения за недостаток информации в моем вопросе. Я использую 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]%' ) 
+0

На мой взгляд, это должно быть написано сценарием. MySQL просто не может динамически добавлять столбцы. Вы можете прокручивать все столбцы 'IF (title LIKE ..., 1, 0) AS matched_on_title и т. Д.' – twicejr

+0

Зачем вам это нужно, не стоит ли добавлять все параметры, а затем в свои сценарий делает логическое сравнение? – twicejr

ответ

0

Используя упрощенную таблицу данных только с содержанием одной идеей является создание временной таблицы проведения критерии поиска проверьте их на исходные данные.

Временная таблица может быть 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 будет достаточно, но можно сделать немного больше: получить реальную ценность вместо критериев поиска. Для этого нужно длину образца, и самый простой способ получить это ... заранее вычислить его, в некотором роде, и добавить его в таблицу TEMP/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, а WHERE условия на LEN из Found поля может удалить всю строку что не соответствует.

+0

Приносим извинения за недостаток информации. Я использую MS SQL, и я действительно пытаюсь найти поле текста, которое может содержать любой из трех вариантов; IH-, MPC или ICC. Вот код, который у меня есть до сих пор; – BryanD

+0

Я пытаюсь понять, как сделать эту работу с моим запросом. Недавно я добавил в свой вопрос. Это то, что я ищу. Вы еще не просмотрели мой существующий код? – BryanD

+0

Да, это то, что я хотел бы. Кроме того, в моем исходном вопросе я предоставил свой примерный запрос с требуемыми критериями поиска. Вы можете это видеть? Спасибо за вашу помощь – BryanD

0
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%') 
0

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)