2

是否可以将值向量与 SQL 中表的所有列进行比较,更具体地说是在 MS SQL Server 中?

例如,我有一个表EXAMPLE,它有3 列:

EXAMPLE: ColA, ColB, ColC

我想检查它的列是否与特定向量匹配: ('val0', 'val1', 'val2')

我知道我可以用这样的句子做到这一点:

SELECT * FROM EXAMPLE WHERE ColA='val0' AND ColB = 'val1' AND ColC = 'val2' 

但我想知道是否有一些功能 ALLEQUAL 可以让我执行以下操作:

SELECT * FROM EXAMPLE WHERE ALLEQUAL('val0', 'val1', 'val2');

我知道如果该函数存在,它的语法在不同的 RDBMS 之间可能会有很大的不同,我现在专注于 Ms SQL Server。不过,如果您能给我提供其他数据库管理器的示例,我将非常高兴。

4

3 回答 3

1

也许这会帮助你

SELECT * 
FROM EXAMPLE 
WHERE ColA+ColB+ColC = 'val0'+'val1'+'val2'
于 2013-07-31T11:55:38.017 回答
1
declare @Foo as Table ( ColA Int, ColB Int );
insert into @Foo ( ColA, ColB ) values ( 1, 1 ), ( 1, 2 ), ( 2, 1 );
select * from @Foo;

select *
  from @Foo
  intersect
  select *
    from ( values ( 2, 1 ) ) as Bar( ColA, ColB );
于 2013-07-31T12:04:00.017 回答
0

在精心设计的数据库中,表将具有主键,键将是行的唯一标识符,因此无需匹配场景中“向量”的其余部分。

现在,如果您有一些平面的非规范化数据,您可以创建一个生成动态 sql 的存储过程来执行您想要的操作。您必须查询 INFORMATION_SCHEMA.columns 或 sys.columns 并生成类似于您编写的第一个 SQL 语句的内容 ~"WHERE ColA='val0' AND ColB = 'val1' AND ColC = 'val2' "

这是使用 FOR XML PATH('') 的仅限 varchar 列的方法

BEGIN
DECLARE @tbl TABLE(c1 VARCHAR(max), c2 VARCHAR(max), c3 VARCHAR(max))
DECLARE @vec TABLE(data VARCHAR(max))
INSERT INTO @tbl VALUES ('abc', '123', 'xyz'), ('cba', '321', 'zyx')
INSERT INTO @vec VALUES ('abc'), ('123'), ('xyz')
SELECT * FROM @tbl
WHERE c1+c2+c3 = (SELECT '' + data FROM @vec FOR XML PATH(''))
END
于 2013-07-31T11:49:35.023 回答