与所有列比较

时间:2013-07-31 11:45:39

标签: sql sql-server-2008

是否可以将值向量与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。不过,如果你能给我其他数据库管理员的例子,我将非常高兴。

3 个答案:

答案 0 :(得分:1)

也许这会对你有所帮助

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

答案 1 :(得分: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 );

答案 2 :(得分:0)

在设计良好的数据库中,表将具有PRIMARY KEY,键将是该行的唯一标识符,因此不需要匹配场景中“vector”的其余部分。

现在,如果你有一些扁平的非规范化数据,你可以创建一个生成动态sql的sproc来做你想要的。您必须查询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