首页 > 解决方案 > SQL Where IN CLAUSE 变量

问题描述

我有一个过程,我基本上必须通过电子表格并在内部系统上按姓名/姓氏和出生日期逐个查找个人姓名,然后检索他们参加的设置。

我已经获得了对数据库的访问权限,并且我以前使用过 SQL,但没有什么广泛的经验。我为我的表设置了如下的虚拟名称,只是因为它可能包含敏感信息。

我想知道是否有更简单的方法可以做到这一点,我最终将通过 VBA 连接到数据库并以这种方式检索数据。我不知道我是否可以在 IN 子句中插入一个变量并创建一个自定义函数,该函数创建一个变量,该变量将返回类似“Bob”、“Keith”等内容,以便可以将其传递给 SQL(希望这是有道理的) )。另外,如果你通过 VBA 传递 SQL,你能传递缩写的表名吗?

另外我不确定是否有可能在正确的行上返回设置,或者最好在多个条件上使用一些查找函数?

这不是我知道的做事的好方法,但它是唯一的方法,因为每个人在我最初收到的数据中都没有唯一的标识符。

SELECT  p.Forename
      ,p.Surname
      ,p.Birth_Date
      ,p.xxx
      ,p.xxx
      ,csc.name
      ,cs.name2 
FROM dbo.Person AS P
INNER JOIN dbo.banana AS csc ON csc.xxx = p.xxx
INNER JOIN dbo.apple AS cs ON cs.xxx = p.xxx
WHERE p.forename IN('xxx', 'xxx', 'xxx', 'xxx')
  AND p.surname IN('xx','xx','xx', 'xx')
  AND p.Birth_Date IN(N'xx', N'xxx', N'xxx', N'xxx')

标签: sqlsql-servervbassms

解决方案


根据您拥有的控制和访问权限,您可以使用 XML 传递值列表。

这是我的意思的一个例子:

DECLARE
    @forenames xml = '<names><name>Bill</name><name>Steven</name><name>Steve</name></names>',
    @surnames xml = '<names><name>Gates</name><name>Spielberg</name><name>Jobs</name></names>',
    @birthdates xml = '<dates><date>10/28/1955</date><date>12/18/1946</date><date>02/24/1955</date></dates>';

SELECT 
    p.Forename
    , p.Surname
    , p.Birth_Date
    , p.xxx
    , p.xxx
    , csc.name
    , cs.name2 
FROM dbo.Person AS P
INNER JOIN dbo.banana AS csc ON csc.xxx = p.xxx
INNER JOIN dbo.apple AS cs ON cs.xxx = p.xxx
WHERE 
    p.forename IN(
        SELECT x.f.value( '.', 'varchar(50)' ) FROM @forenames.nodes( '//names/name' ) x( f )
    )
    AND p.surname IN(
        SELECT x.f.value( '.', 'varchar(50)' ) FROM @surnames.nodes( '//names/name' ) x( f )
    )
    AND p.Birth_Date IN(
        SELECT x.f.value( '.', 'varchar(50)' ) FROM @birthdates.nodes( '//dates/date' ) x( f )
    );

推荐阅读