我有一张表格如下:
TABLE1
No Description
1 Hello Hai Hello
2 Good Bad Good
3 Hello Good Hai
4 Hai Hello Bad
5 Hello Hello Hello
现在,如果我运行以下查询:
Select *
from TABLE1
where Description like '%Hai%'
OR Description like '%Hello%'
OR Description like '%Good%'
我希望结果如下(通过添加一个额外的列“FIRST MATCHED WORD”):
No Description First Matched Word
1 Hello Hai Hello Hai
2 Good Bad Good Good
3 Hello Good Hai Hai
4 Hai Hello Bad Hai
5 Hello Hello Hello Hello
听到我的意图是找出第一个匹配的单词取决于我们的查询。请帮助我。
答案 0 :(得分:3)
您可以通过以下方式在CASE statement
查询中使用SELECT
:
Select No,Description,
CASE
WHEN Description like '%Hai%' THEN 'Hai'
WHEN Description like '%Hello%' THEN 'Hello'
WHEN Description like '%Good%' THEN 'Good'
END
from TABLE1
where Description like '%Hai%'
OR Description like '%Hello%'
OR Description like '%Good%'
请参阅SQLFIDDLE
Case Statement
返回计算结果为TRUE
的第一个布尔表达式的结果。
答案 1 :(得分:2)
试试这个:
如果要添加更多匹配的单词,只需将该单词添加到具有排名的优先级表中即可。如果要匹配大量单词,可以将优先级表作为永久表
with precedence as(
select 1 rnk, 'Hai' as word union all
select 2 rnk, 'Hello' union all
select 3 rnk, 'Good' ),
cte as
(select *
from Table1
join precedence
on [Description] like '%'+word+'%' ),
cte1 as(select [No],[Description],word,
ROW_NUMBER() over (partition by [No] order by rnk) as row_num
from cte)
select [No],[Description],word from cte1 where row_num=1
答案 2 :(得分:2)
试试这个:
select *,'Hai' as 'First Matched Word' from Table1 where [Description] like '%Hai%'
union
select *,'Hello' as 'First Matched Word' from Table1 where [Description] like '%hello%'
and [No] not in(select [No] from Table1 where [Description] like '%Hai%')
union
select *,'Good' as 'First Matched Word' from Table1 where [Description] like '%Good%'
and [No] not in(select [No] from Table1 where [Description] like '%hello%'
or [Description] like '%Hai%'
);
答案 3 :(得分:1)
试试这个:
;WITH CTE AS
(
SELECT
t1.No,
t1.Description,
t2.Description AS matched,
ROW_NUMBER() OVER(PARTITION BY t1.DESCRIPTION
ORDER BY t1.DESCRIPTION) row_num
FROM @TABLE1 t1
INNER JOIN
(
SELECT Description = 'Hai'
UNION ALL
SELECT 'Hello'
UNION ALL
SELECT 'Good'
) t2 ON t1.Description LIKE '%' + t2.Description + '%'
)
SELECT
No,
Description,
matched AS 'first matched word'
FROM CTE
WHERE row_num = 1
ORDER BY no;
答案 4 :(得分:1)
如果是这种情况,你可以选择if else语句,如下所示
if exists(select * from Table1 where description like '%Hai%')
begin
update table1 set FirstMatchedWord = 'Hai' where No = @No
end
else
begin
if exists(select * from Table1 where description like '%Hello%')
begin
update table1 set FirstMatchedWord = 'Hello' where No = @No
end
else
begin
if exists(select * from Table1 where description like '%Good%')
begin
update table1 set FirstMatchedWord = 'Good' where No = @No
end
end
end
希望这会有所帮助:D