Joh*_*ate 1 sql-server select intersect
我正在使用 SQL Server 并尝试执行以下操作:
SELECT dword FROM Details WHERE dskey = '51a'
INTERSECT
SELECT dword FROM Details WHERE dskey = '52b'
INTERSECT
SELECT dword FROM Details WHERE dskey = '53i'
INTERSECT
SELECT dword FROM Details WHERE dskey = '54d'
INTERSECT
SELECT dword FROM Details WHERE dskey = '55e';
Run Code Online (Sandbox Code Playgroud)
这工作正常。但是,我需要构建一个通用的 SELECT,如:
SELECT dword FROM Details WHERE dskey = value1
INTERSECT
SELECT dword FROM Details WHERE dskey = value2
INTERSECT
SELECT dword FROM Details WHERE dskey = value3
INTERSECT
SELECT dword FROM Details WHERE dskey = value4
INTERSECT
SELECT dword FROM Details WHERE dskey = value5;
Run Code Online (Sandbox Code Playgroud)
但是,在任何给定的执行中,我可能不会拥有所有五个关键值。我需要以某种方式拥有不会干扰他的 INTERSECT 的虚拟键值。
例如,假设我只有 1 个值,其余 4 个为空。但是 INTERSECT 不起作用(正确)。
无论如何都有不会干扰INTERSECTS的虚拟值。
我讨厌必须做嵌套的 ifs,如果我只有一个值,我只执行一个 SELECT。如果我有两个值,那么我有两个 SELECTS,中间有一个 INTERSECT 等等。
这就是全部内容:
假设我有一个 5 个字符的单词,我希望能够执行 SELECT WHERE 来返回一个列表,其中列出了所有在第三个位置包含“i”的 5 个字符的单词。很容易。然后我可能想选择第三个位置是“i”,第五个位置是“e”。这类似于“命运之轮”。我可能会遵守所有五个值,因此只应遵守返回的集合。因此,最好有一组 5 个 SELECTS 和四个中间的 INTERSECTS,该构造可以处理 1 到 5 个值。
我已经尝试过 NULL 值,但显然它不应该工作。
您还可以将查询构造为:
SELECT dword
FROM Details
WHERE dskey IN (value1, value2, value3, value4, value5)
GROUP BY dword
HAVING COUNT(DISTINCT dskey) = 5;
Run Code Online (Sandbox Code Playgroud)
您仍然需要替换IN列表和数字 5。您可以使用显式参数编写此代码:
WITH vals as (
SELECT v.val
FROM (VALUES (@value1), (@value2), (@value3), (@value4), (@value5)) v(val)
)
SELECT dword
FROM Details d JOIN
vals
ON d.dskey = vals.val
GROUP BY dword
HAVING COUNT(DISTINCT dskey) = (SELECT COUNT(*) FROM vals);
Run Code Online (Sandbox Code Playgroud)
这是完全可参数化的并处理NULL值。
编辑:
实际上,您也可以使用您的版本执行此操作:
SELECT dword FROM Details WHERE dskey = @value1 or @value1 IS NULL
INTERSECT
SELECT dword FROM Details WHERE dskey = @value2 or @value2 IS NULL
INTERSECT
SELECT dword FROM Details WHERE dskey = @value3 or @value3 IS NULL
INTERSECT
SELECT dword FROM Details WHERE dskey = @value4 or @value4 IS NULL
INTERSECT
SELECT dword FROM Details WHERE dskey = @value5 or @value5 IS NULL;
Run Code Online (Sandbox Code Playgroud)
与所有行相交是交叉无操作。
| 归档时间: |
|
| 查看次数: |
2513 次 |
| 最近记录: |