Динамическое JOIN в MySQL - PullRequest
0 голосов
/ 05 июля 2019

Допустим, у меня есть запрос -

Create Temporary Table myparams AS (
SELECT 'xyz' AS Column1
);

SELECT * FROM MyTable x
JOIN myparams y ON x.Column1 = y.Column1

Это работает отлично. Однако, скажем, я делаю это:

Create Temporary Table myparams AS (
SELECT NULL AS Column1
);

Что я хочу сделать здесь, так это то, что когда в params есть NULL, я хочу вернуть все строки, когда присоединяюсь к MyTable.

Примерно так:

SELECT * From MyTable x
IF(myparams.Column1 IS NULL, LEFT JOIN myparams.Column1 = x.Column1, 
INNER JOIN myparams.Column1 = x.Column1)

Я спрашиваю об этом, так как у меня есть хранимая процедура, которая принимает параметры, которые могут иметь значение или NULL, и я не хочу использовать find_in_set, поскольку он оценивает строку за строкой, которая неэффективна при работе с огромным количеством данные.

Редактирование вопроса, так как мне не было понятно о таблице params. Входные параметры могут быть разделены запятыми. Таким образом, для параметра нет единственного значения.

Для бывших -

Input params - `000-0000`, 1111-2222`

So currently I do this:

SELECT * FROM MyTable
find_in_set(MyTable.Column1, InputParams)

Это оценивает каждую строку, что очень неэффективно для строк 25 М.

Я скорее думал создать временную таблицу со всеми входными параметрами, а затем присоединиться к MyTable

1 Ответ

0 голосов
/ 05 июля 2019
WITH myparams AS (
SELECT null AS Column1
)
SELECT *
FROM MyTable x
INNER JOIN myparams y 
     ON x.Column1 IN (SELECT * FROM STRING_SPLIT(y.Column1,','))
          OR y.Column1 IS NULL

Выше возвращает все значения таблицы «MyTable», а следующий запрос - только те, где Column1 - «a» или «b»

WITH myparams AS (
SELECT 'a,b' AS Column1
)
SELECT *
FROM MyTable x
INNER JOIN myparams y 
     ON x.Column1 IN (SELECT * FROM STRING_SPLIT(y.Column1,','))
          OR y.Column1 IS NULL

и третий параметр:

WITH myparams AS (
SELECT 'a,b' AS Column1
)
SELECT *
FROM MyTable x
INNER JOIN myparams y 
     ON x.Column1 = (SELECT value 
                     FROM STRING_SPLIT((SELECT ISNULL(Column1,'') 
                                        FROM myparams),',') 
                     WHERE value=x.Column1)
          OR (SELECT top 1 value 
              FROM STRING_SPLIT((SELECT ISNULL(Column1,'') 
                                 FROM myparams),',')) = ''

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

...