假设我有一个查询-

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
);


我要在这里做的是,当NULL中有params时,我想在加入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 M行而言效率非常低。

我当时想创建一个包含所有输入参数的临时表,然后加入MyTable

最佳答案

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),',')) = ''


我没有大型数据集,但是此第三个选项应具有最佳性能。

关于mysql - MySQL中的动态JOIN,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56905220/

10-11 23:48