假设我有一个查询-
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/