2014-12-08 3 views
1

Im пытается получить это заявление на работу, чтобы заминировать некий текст в FREETEXT полях ...Case Select Затем вставить в Temp таблицы не работает

SELECT 
CASE 
    WHEN Theme_Q1 LIKE '%Education%' THEN 
     INSERT INTO #tempThemeCnt(Theme1, ThemeCnt) VALUES ('Education', 1 ) 
    WHEN Theme_Q1 LIKE '%Care%' THEN 
     INSERT INTO #tempThemeCnt(Theme1, ThemeCnt) VALUES ('Care', 1 ) 
END 
FROM dbo.tblWNHPSurvey 

Спасибо вам всем за помощь ...

ответ

1

EDIT - обновление, чтобы отразить актуальную проблему OP, как описано в блоке комментариев ниже.

http://sqlfiddle.com/#!3/efd1b/5

Этот должен работать на SQL Server 2005 - У меня нет никакого способа тестирования этого. Самая ранняя версия, которую я могу запустить, - это 2008R2. Также - вы должны полностью апгрейда!

Если вы не можете увидеть, как реорганизовать его на свои столы, отправьте комментарий, но я надеюсь, что это будет довольно очевидно.

Это использует APPLY для подсчета ссылок для вас.

SELECT 
    t.tag, 
    ISNULL(m.matches, 0) AS Matches 
FROM 
    tags AS t 
    OUTER APPLY (
    SELECT COUNT(*) 
    FROM TestSet AS ts 
    WHERE ts.Label LIKE '%' + t.tag + '%' 
    ) 
    AS m (matches) 

Схема, используемая:

CREATE TABLE TestSet (
    TestID INT IDENTITY(1,1) PRIMARY KEY, 
    Label VARCHAR(MAX) 
) 

INSERT TestSet(Label) 
     SELECT 'Educational Care' 
UNION SELECT 'Care Failure' 
UNION SELECT 'SomeRandomTextHere' 
UNION SELECT 'Care Education' 


CREATE TABLE Tags(
    Tag VARCHAR(255) PRIMARY KEY 
) 

INSERT Tags (Tag) 
     SELECT 'Education' 
UNION SELECT 'Care' 

Результаты:

TAG   MATCHES 
Care  3 
Education 2 

Примечания: Это, вероятно, будет довольно медленно ... Одноименные '%%' сказуемое не имеет возможный индекс он может использовать.

Оригинальный ответ ...

случай не является управление реле потока - сво форматировщик. вы не делать что-то другое для каждого случая - вы возвращаете что-то другое

было бы что-то вроде этого:

INSERT #tempThemeCnt(Theme1, ThemeCnt) 
SELECT 
    CASE 
     WHEN Theme_Q1 like '%Education%' THEN 'Education' 
     WHEN Theme_Q1 like '$Care%' THEN 'Care' 
     ELSE Theme_Q1 
    END AS Theme1, 
    1 AS ThemeCnt 
FROM 
    dbo.tblWNHPSurvey 

Обратите внимание, что его невозможно отличить от вашего примера, что вы хотите, если значения не были привязаны к Образованию или Уходу за вниманием - этот пример просто хранит все, что было в dbo.tblWNHPSurvey, в таблицу temp с ThemeCnt из 1, если это не соответствует ...

Также - я подозреваю, что вы можете захотеть группа это впоследствии ....

+0

Привет, Чарли. Да, вы правы. Я сгруппирую их в конце, как только у меня все они будут учтены. В принципе, у меня есть 40 плюс ключевые слова, чтобы соответствовать каждому полю и считать их, если они совпадают. Поэтому я ожидаю, что в конце концов мой соблазнительный замахнет либо 5 из десяти раз его ординарных рядов. То, что я хочу достичь, - это проверять каждое поле и подсчитывать каждое найденное ключевое слово. Спасибо всем за помощь. – Duke0ne

+0

Если я понимаю вас, тогда я не думаю, что это на самом деле то, что вы хотите сделать. Если строка может соответствовать нескольким ключевым словам, и вы хотите, чтобы эта строка считалась совпадающей со всеми совпадающими ключевыми словами, этот метод не будет работать. Каждая строка будет соответствовать * не более * одному из этих случаев. Опубликуйте некоторые данные примера и ожидаемый результат, но похоже, что это не решение –

+0

, какую версию SQL Server вы используете? –

1

Попробуйте следующее:

INSERT INTO #tempThemeCnt(Theme1, ThemeCnt) 
SELECT (CASE WHEN Theme_Q1 LIKE '%Education%' THEN 'Education' 
      WHEN Theme_Q1 LIKE '%Care%' THEN 'Care' 
      ELSE '' 
     END) AS Theme1, 1 
FROM dbo.tblWNHPSurvey; 
+0

Ничего себе! Это было быстро! :) Спасибо Saharsh Shah! Я понял, что если у меня есть несколько ключевых слов в поле, он найдет только первое и игнорирует остальные. Я хочу подсчитать каждое ключевое слово, не могли бы вы помочь? – Duke0ne

0

Sadly case не работает подобный. Вы можете достичь этого, используя что-то вроде ниже логики:

if exists (select top 1 1 from dbo.tblWNHPSurvey where Theme_Q1 like '%Education%') 
insert into #tempThemeCnt(Theme1, ThemeCnt) VALUES ('Education', 1 ) 

if exists (select top 1 1 from dbo.tblWNHPSurvey where Theme_Q1 like '%Care%') 
insert into #tempThemeCnt(Theme1, ThemeCnt) VALUES ('Care', 1 ) 
+0

NB: мой ответ создаст только 1 учебную и/или 1 учетную запись ухода, независимо от количества совпадений в таблице tblWNHPSurvey. @ SaharshShah создаст по одной записи для каждого матча в этой таблице. Не знаете, на какое решение вы рассчитываете, так что либо может быть правильным для вашего сценария. – JohnLBevan

+0

Спасибо, Джон! пожалуйста, напишите мой следующий вопрос, который я добавил к Чарли. – Duke0ne

Смежные вопросы