假设我有一个查询 -
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
,因为它可以通过行评估行,这在使用大量数据时效率低下。p>编辑问题,因为我不清楚params
表。输入参数可以是逗号分隔的文本。因此,参数没有一个值。
for ex -
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'的所有值,下一个查询仅查询列1是'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),',')) = ''
我没有大数据集,但是第三个选项应该是最佳性能。