【发布时间】:2020-07-27 03:33:57
【问题描述】:
我正在寻找一种将CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA)) 放入单个变量的方法,这样就不需要为包含数百个OR LIKE 部分的SQL 搜索输入数百次。
SELECT
WT.Sku AS Sku
, WS.View AS View
, WT.TitleA AS TitleA
, WT.Index AS Index
, WT.CondB AS CondB
, WT.TitleF AS TitleF
, WT.PublisherA AS PublisherA
, WT.SeriesA AS SeriesA
FROM
wt_table_one AS WT
INNER JOIN public.ws_table_one AS WS ON WT.Index = WS.Index
WHERE
WS.View = 17
AND (
CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA)) LIKE '%PANTHER%'
OR CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA)) LIKE '%WISHING%'
OR (CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA)) LIKE '%MIGHTY%' AND CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA)) LIKE '%THOR%')
OR (CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA)) LIKE '%ANIMAL%' AND CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA)) LIKE '%CROSSING%')
OR (CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA)) LIKE '%BRIAN%' AND CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA)) LIKE '%BLESSED%')
OR (CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA)) LIKE '%ONE%' AND CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA)) LIKE '%OF%' AND CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA)) LIKE '%A%' AND CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA)) LIKE '%KIND%')
)
LIMIT 10000
(还有大约另外一百个左右 LIKE 条件,但我在这里删减了)
我是 SQL 新手,所以请耐心等待,但我尝试了以下方法。
SELECT
@concvar :=CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA))
,WT.Sku AS Sku
...
SET @concvar =CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA))
SELECT
WT.Sku AS Sku
...
来自https://www.oreilly.com/library/view/mysql-cookbook/0596001452/ch01s15.html
如果没有它,一切仍然可以正常工作,但我宁愿只有一个地方来更新它而不是几百个。
-编辑- 我的目标是这样的。
CONCATVAR = CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA))
SELECT
WT.Sku AS Sku
, WS.View AS View
, WT.TitleA AS TitleA
, WT.Index AS Index
, WT.CondB AS CondB
, WT.TitleF AS TitleF
, WT.PublisherA AS PublisherA
, WT.SeriesA AS SeriesA
FROM
wt_table_one AS WT
INNER JOIN public.ws_table_one AS WS ON WT.Index = WS.Index
WHERE
WS.View = 17
AND (
CONCATVAR LIKE '%PANTHER%'
OR CONCATVAR LIKE '%WISHING%'
OR (CONCATVAR LIKE '%MIGHTY%' AND CONCATVAR LIKE '%THOR%')
OR (CONCATVAR LIKE '%ANIMAL%' AND CONCATVAR LIKE '%CROSSING%')
OR (CONCATVAR LIKE '%BRIAN%' AND CONCATVAR LIKE '%BLESSED%')
OR (CONCATVAR LIKE '%ONE%' AND CONCATVAR LIKE '%OF%' AND CONCATVAR LIKE '%A%' AND CONCATVAR LIKE '%KIND%')
)
LIMIT 10000
【问题讨论】:
-
用您正在使用的数据库标记您的问题。
-
附注:
CONCAT_WS('', ...)将字符串直接粘合在一起。WT.TitleA = 'TIME SPAN'加上WT.CondB = 'THERE MUST BE TWO MONTHS LEFT'变为'TIME SPANTHERE MUST BE TWO MONTHS LEFT'匹配'%PANTHER%'。
标签: mysql sql join where-clause sql-like