'在' SQL Server中具有多列

时间:2016-02-04 06:32:10

标签: sql sql-server oracle

我有一个组件,它根据提供的密钥从数据库中检索数据。 但是我希望我的java应用程序能够获取单个数据库中所有键的所有数据,以便加快操作。 我可以在'中使用'当我只有一把钥匙的时候。

在处理多个密钥时,我可以在oracle中使用以下查询

SELECT * FROM <table_name> 
where (value_type,CODE1) IN (('I','COMM'),('I','CORE'));

类似于写作

SELECT * FROM <table_name> 
where value_type = 1 and CODE1 = 'COMM' 

SELECT * FROM <table_name> 
where value_type = 1 and CODE1 = 'CORE' 

一起

然而,这个使用&#39;的概念上面的子句在SQL Server&#39;

中给出了以下错误

ERROR:An expression of non-boolean type specified in a context where a condition is expected, near ','.

请告知他们是否可以在SQL服务器中实现相同的目标。

9 个答案:

答案 0 :(得分:6)

此语法在SQL Server中不存在。使用AndOr的组合。

SELECT * 
FROM <table_name> 
WHERE 
  (value_type = 1 and CODE1 = 'COMM')
  OR (value_type = 1 and CODE1 = 'CORE') 

(在这种情况下,您可以缩短它,因为value_type在两种组合中都与相同的值进行比较。我只想在oracle中显示类似于IN的模式,具有多个字段。)

将IN与子查询一起使用时,需要将其改为:

甲骨文:

SELECT * 
FROM foo 
WHERE 
  (value_type, CODE1) IN (
    SELECT type, code 
    FROM bar
    WHERE <some conditions>)

SQL Server:

SELECT * 
FROM foo 
WHERE 
  EXISTS (
    SELECT * 
    FROM bar 
    WHERE <some conditions>
      AND foo.type_code = bar.type 
      AND foo.CODE1 = bar.code)

还有其他方法可以做,具体取决于案例,如内部联接等。

答案 1 :(得分:2)

如果要检查的元组少于1000个,并且您正在使用SQL Server 2008+,则可以使用table values constructor并对其执行联接。在一个表值构造函数中,最多只能指定1000行,因此有1000个元组限制。这是您情况下的外观:

SELECT <table_name>.* FROM <table_name> 
JOIN ( VALUES
    ('I', 'COMM'),
    ('I', 'CORE')
) AS MyTable(a, b) ON a = value_type AND b = CODE1;

这只是一个好主意,如果您的值列表将是唯一的,否则您将获得重复的值。我不确定与使用许多AND和OR相比,它的性能如何,但是我认为SQL查询至少要清晰得多。

您也可以编写此代码以使用EXIST代替JOIN。这可能具有不同的性能特征,如果您的值不是唯一的,它将避免产生重复结果的问题。可能值得在您的用例上同时尝试EXIST和JOIN,以查看哪种方法更合适。这是EXIST的外观,

SELECT * FROM <table_name> 
WHERE EXISTS (
    SELECT 1
    FROM (
        VALUES
            ('I', 'COMM'),
            ('I', 'CORE')
    ) AS MyTable(a, b)
    WHERE a = value_type AND b = CODE1
);

最后,我认为最好的选择是创建一个临时表并对其进行查询。但是有时候这是不可能的,例如您的用户没有创建临时表的权限,因此使用表值构造函数可能是您的最佳选择。使用EXIST或JOIN,具体取决于哪种数据库可以为您带来更好的性能。

答案 2 :(得分:1)

更好的解决方案是避免对您的值进行硬编码,然后将其放在临时表或持久表中:

CREATE TABLE #t (ValueType VARCHAR(16), Code VARCHAR(16))

INSERT INTO #t VALUES ('I','COMM'),('I','CORE')

SELECT DT. * 
FROM <table_name> DT 
JOIN #t T ON T.ValueType = DT.ValueType AND T.Code = DT.Code

因此,您可以避免在代码中存储数据(持久表版本),并允许轻松修改过滤器(无需更改代码)。

答案 3 :(得分:1)

我认为您可以尝试这一点,同时合并andor

SELECT 
  * 
FROM 
  <table_name> 
WHERE 
  value_type = 1 
  AND (CODE1 = 'COMM' OR CODE1 = 'CORE')

答案 4 :(得分:0)

IN Clause

Query

SELECT * FROM [table_name]
WHERE value_type IN (1)
AND CODE1 IN ('COMM', 'CORE');

SELECT * FROM [Table_Name]
WHERE value_type = 1
AND (CODE1 = 'COMM' OR CODE1 = 'CORE');

答案 5 :(得分:0)

你能做的就是加入&#39;将列作为字符串,并将您的值也合并为字符串。

where (cast(column1 as text) ||','|| cast(column2 as text)) in (?1)

另一种方法是做多个ands和ors。

答案 6 :(得分:0)

通常你不能这样做,但可以使用以下技术。

SELECT * FROM <table_name> 
where (value_type+'/'+CODE1) IN (('I'+'/'+'COMM'),('I'+'/'+'CORE'));

答案 7 :(得分:0)

我在MS SQL中遇到了类似的问题,但有点不同。也许它会帮助有人在futere,在我的情况下,我找到了这个解决方案(不是完整的代码,只是示例):

SELECT Table1.Campaign
      ,Table1.Coupon
  FROM [CRM].[dbo].[Coupons] AS Table1 
  INNER JOIN [CRM].[dbo].[Coupons] AS Table2 ON Table1.Campaign = Table2.Campaign AND Table1.Coupon = Table2.Coupon
  WHERE Table1.Coupon IN ('0000000001', '0000000002') AND Table2.Campaign IN ('XXX000000001', 'XYX000000001')

优惠券上的cource和表格中的Campaign我有快速搜索索引。

答案 8 :(得分:0)

在 MS Sql 中计算

SELECT * FROM <table_name> 
where value_type + '|' + CODE1 IN ('I|COMM', 'I|CORE');