我有一个组件,它根据提供的密钥从数据库中检索数据。 但是我希望我的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服务器中实现相同的目标。
答案 0 :(得分:6)
此语法在SQL Server中不存在。使用And
和Or
的组合。
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)
我认为您可以尝试这一点,同时合并and
和or
。
SELECT
*
FROM
<table_name>
WHERE
value_type = 1
AND (CODE1 = 'COMM' OR CODE1 = 'CORE')
答案 4 :(得分:0)
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');