Есть ли способ создать переменную WHERE в запросе SQL SELECT, чтобы избежать повторений? - PullRequest
0 голосов
/ 14 апреля 2020

Я ищу способ поместить CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA)) в одну переменную, чтобы его не нужно было печатать сотни раз для поиска SQL с сотнями OR LIKE деталей.

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

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

-Edit- Моя цель будет примерно такой:

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

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Вы можете использовать подзапрос:

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 (
    SELECT
        WT.*,
        CONCAT_WS('',upper(WT.TitleA),upper(WT.CondB),upper(WT.TitleF),upper(WT.PublisherA),upper(WT.SeriesA)) 
    FROM wt_table_one AS WT
    INNER JOIN public.ws_table_one AS WS ON WT.Index = WS.Index
    WHERE WS.View = 17
) t
WHERE  
    mycol LIKE '%PANTHER%'
    OR myval  LIKE '%WISHING%'
    OR (myval LIKE '%MIGHTY%' AND myval LIKE '%THOR%')
    OR (myval LIKE '%ANIMAL%' AND myval LIKE '%CROSSING%')
    OR (myval LIKE '%BRIAN%'  AND myval LIKE '%BLESSED%')
    OR (myval LIKE '%ONE%'    AND myval LIKE '%OF%' AND myval LIKE '%A%' AND myval  LIKE '%KIND%')
LIMIT 10000
1 голос
/ 14 апреля 2020

Один метод является подзапросом:

SELECT wt.*
FROM (SELECT wt.*,
             CONCAT_WS('', upper(WT.TitleA), upper(WT.CondB), upper(WT.TitleF), upper(WT.PublisherA), upper(WT.SeriesA)) as concat_str
      FROM wt_table_one wt JOIN
           public.ws_table_one ws
           ON WT.Index = WS.Index
      WHERE WS.View = 17
     ) wt
WHERE wt.concat_str LIKE '%PANTHER%' OR
      wt.concat_str LIKE '%WISHING%' OR
      (wt.concat_str LIKE '%MIGHTY%' AND wt.concat_str LIKE '%THOR%') OR
      (wt.concat_str LIKE '%ANIMAL%' AND wt.concat_str LIKE '%CROSSING%') OR
      (wt.concat_str LIKE '%BRIAN%' AND wt.concat_str LIKE '%BLESSED%') OR
      (wt.concat_str LIKE '%ONE%' AND wt.concat_str LIKE '%OF%' AND wt.concat_str LIKE '%A%' AND wt.concat_str LIKE '%KIND%')
      )
LIMIT 10000

Вы также можете сделать это с помощью CTE или бокового соединения (если ваша база данных поддерживает это). Вы, вероятно, также используете регулярные выражения, если ваша база данных поддерживает это.

...