我们有一个包含2列的表格:
ZahlBed | Bez
------------------------------------------------------
60 | 60 Tage betto. Für Rechnungen & Gutschriften
60 | 60 Tage netto. Für Rechnungen & Gutschriften
60 | ne
14 | 14 Tage netto. Für Rechnungen & Gutschriften
.
.
.
现在我们要在两列中搜索给定的字符串(即60)并使用SortFactor对结果进行加权:
第一个Statement将在'ZahlBed'中搜索'60'并且具有sortfactor 10。 第二次搜索'%60%'并且将给我们600左右并且具有sortfactor 11。 第三个搜索'Bez'列中的'%60%',sortfactor 20。 最后在'Bez'列中搜索60,sortfactor 15。 最后,它将由SortFactor订购。
SELECT DISTINCT TOP 20 ZahlBed,Bez,SortFactor FROM ((
SELECT ZahlBed,Bez ,10 AS SortFactor FROM XXAV_CMCTermOfPayment WHERE (ZahlBed LIKE 60) ) UNION
SELECT ZahlBed,Bez ,11 AS SortFactor FROM XXAV_CMCTermOfPayment WHERE ZahlBed LIKE '%60%' AND LEN(ZahlBed) <> LEN('60') UNION
SELECT ZahlBed,Bez ,20 AS SortFactor FROM XXAV_CMCTermOfPayment WHERE Bez LIKE '%60%' UNION
SELECT ZahlBed,Bez ,15 AS SortFactor FROM XXAV_CMCTermOfPayment WHERE Bez LIKE 60) A
ORDER BY SortFactor ASC
预期结果如下:
ZahlBed | Bez | SortFactor
-------------------------------------------------------------------
60 | 60 Tage betto. Für Rechnungen & Gutschriften | ...
60 | 60 Tage netto. Für Rechnungen & Gutschriften | ...
60 | ne | ...
相反,我们得到了这个:
ZahlBed | Bez | SortFactor
--------------------------------------------------------------------
60 | 60 Tage betto. Für Rechnungen & Gutschriften | 10
60 | 60 Tage netto. Für Rechnungen & Gutschriften | 10
60 | ne | 10
60 | 60 Tage betto. Für Rechnungen & Gutschriften | 20
60 | 60 Tage netto. Für Rechnungen & Gutschriften | 20
我们现在的问题是,我们在'ZahlBed'和'Bez'列中得到重复,但在'SortFactor'中没有。
我们怎样才能获得不同的价值?
答案 0 :(得分:2)
您可以使用case
表达式来计算每行SortFactor
一次:
select top 20
ZahlBed
, Bez
, SortFactor
from (
select
ZahlBed
, Bez
, case
when ZahlBed like 60 then 10
when ZahlBed like '%60%' and len(ZahlBed) <> len('60') then 11
when Bez like '%60%' then 15
when Bez like 60 then 20
else -1
end as SortFactor
from xxav_cmctermOfPayment
) s
where SortFactor > 0
order by SortFactor
或者,您可以使用group by
汇总结果,然后选择min(SortFactor)
:
select top 20
ZahlBed
, Bez
, min(SortFactor) as SortFactor
from (select ZahlBed, Bez, 10 as SortFactor from xxav_cmctermOfPayment where (ZahlBed like 60)
union select ZahlBed, Bez, 11 as SortFactor from xxav_cmctermOfPayment where ZahlBed like '%60%' and len(ZahlBed) <> len('60')
union select ZahlBed, Bez, 20 as SortFactor from xxav_cmctermOfPayment where Bez like '%60%'
union select ZahlBed, Bez, 15 as SortFactor from xxav_cmctermOfPayment where Bez like 60
) A
group by ZahlBed, Bez
order by min(SortFactor) asc
rextester演示(SQL Server):http://rextester.com/WPIDS94742
rextester演示(Oracle):http://rextester.com/RUDA52769
答案 1 :(得分:1)
尝试运行此功能。
select top 20 ZahlBed, Bez, SortFactor from
(
select ZahlBed,Bez,
case
when (ZahlBed LIKE 60) then 10
when ZahlBed LIKE '%60%' AND LEN(ZahlBed) <> LEN('60') then 11
when Bez LIKE '%60%' then 20
when Bez LIKE 60 then 15
end
as sortFactor
from XXAV_CMCTermOfPayment
where
(
ZahlBed LIKE 60
or
(ZahlBed LIKE '%60%' AND LEN(ZahlBed) <> LEN('60') )
or
Bez LIKE '%60%'
or
Bez LIKE 60
)
) t
order by SortFactor