我想为EF 6.0中的sql IN子句创建一个动态linq表达式,代码为第一个approch.请注意,我是Expressions的新手.我想要的是
select * from Courses where CourseId in (1, 2, 3, 4)
//CourseId is integer
Run Code Online (Sandbox Code Playgroud)
正常的linq查询看起来像这样.但我想动态查询它
string[] ids = new string[]{"1", "2", "3", "4"};
var courselist = DBEntities.Courses.Where(c => ids.Contains(SqlFunctions.StringConvert((decimal?)c.CourseId)))
Run Code Online (Sandbox Code Playgroud)
有两种方法可以进行动态表达.
1)一种方法是遍历id并创建表达式
下面的代码将在调试视图中创建以下表达式
{f => ((StringConvert(Convert(f.CourseId)).Equals("23") Or StringConvert(Convert(f.CourseId)).Equals("2")) Or StringConvert(Convert(f.CourseId)).Equals("1"))}
Run Code Online (Sandbox Code Playgroud)
动态表达是
var param = Expression.Parameters(typeof(Course), "f")
MemberExpression property = Expression.PropertyOrField(param, "CourseId");
MethodInfo mi = null;
MethodCallExpression mce = null;
if (property.Type == typeof(int))
{
var castProperty = Expression.Convert(property, typeof(double?));
var t = Expression.Parameter(typeof(SqlFunctions), "SqlFunctions");
mi = typeof(SqlFunctions).GetMethod("StringConvert", new …
Run Code Online (Sandbox Code Playgroud) 我的应用程序中有 JavaScript 代码,它使用 OR(||) 条件检查值,如下面的代码片段所示。在我的大部分代码中,OR 条件的数量并不少。
问题:有没有办法通过使用这样的方法使具有多个 OR 条件的代码更加简洁:value IN ('s','b','g','p','z')
?我对尽可能接近 IN 子句的东西感兴趣。
if(value === "s" || value === "b" || value === "g" || value === "p" || value === "z") {
//do something
}
Run Code Online (Sandbox Code Playgroud) 如何将整数列表传递给MyBatis XML,以便在MySQL查询的in子句中使用?
我正在使用Java 7,MySQL 5.6 DB和MyBatis 3.0.4以及mapper-xml
文件中的查询.
目前,我正在将这个整数列表转换为字符串,并使用字符串替换(${}
运算符)将值放在"IN"子句中 - 虽然它按预期工作,但这种方法使参数容易受到注入.
我尝试过使用一个<foreach>
元素,但我无法弄清楚要指定的属性.
下面是一个示例Java代码:
public List<Stripper> getStripperDetails(String club, List<Integer> stripperIds) {
Map<String, Object> input = new HashMap<>();
input.put("club", club);
input.put("stripperIds", stripperIds);
return stripClubMapper.getStripperDetails(input);
}
Run Code Online (Sandbox Code Playgroud)
映射器xml:
<select id="getStripperDetails" parameterType="java.util.HashMap" resultMap="StripperMap">
SELECT STRIPPER_ID, STAGE_NAME, REAL_NAME, CLUB FROM EXOTIC_DANCERS WHERE CLUB = #{club} AND STRIPPER_ID IN
<foreach item="item" index="index" collection="stripperIds" open="(" separator="," close=")">
#{index}
</foreach>
</select>
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚要为<foreach>
元素指定的属性- 我继续为#{index}的值运行NullPointerException.
你能帮我理解<foreach>
元素的正确用法吗?
编辑:
@ 10086,
下面是堆栈跟踪:
org.mybatis.spring.MyBatisSystemException: nested …
Run Code Online (Sandbox Code Playgroud) 我必须运行这样的查询(查询1) -
select something from sometable where someId in (1,2,3)
Run Code Online (Sandbox Code Playgroud)
我想为ID部分保留一个变量,就像这样(查询2) -
set @myIds = "1,2,3";
select something from sometable where someId in (@myIds);
Run Code Online (Sandbox Code Playgroud)
但是这不会给出预期的结果(给出一个空的结果集),也没有查询错误.
我检查了如果我将逗号分隔的ID包装在引号内,查询结果为空结果集(查询3) -
select something from sometable where someId in ("1,2,3");
Run Code Online (Sandbox Code Playgroud)
I guess when I am using variable @myIds like I showed above (query 2), it is evaluating to the above query (query 3).
我在python中有一个列表.
article_ids = [1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)
我需要在sql语句中使用这个列表,如下所示:
SELECT id FROM table WHERE article_id IN (article_ids)
Run Code Online (Sandbox Code Playgroud)
我怎样才能将这个清单提供给我的IN()
条款?
我已经尝试了一些谷歌搜索方式,但我无法理解.
>> print ids_list
placeholders= ', '.join('?'*len(ids_list)) # "?, ?, ?, ... ?"
query = 'SELECT article_id FROM article_author_institution WHERE institution_id IN ({})'.format(placeholders)
print query
cursor.execute(query, ids_list)
Run Code Online (Sandbox Code Playgroud)
我得到的错误消息:
SELECT article_id FROM article_author_institution WHERE institution_id IN (?)
query = query % db.literal(args)
TypeError: not all arguments converted during string formatting
Run Code Online (Sandbox Code Playgroud)
例如:
ids_list = [9,10]
placeholders= ', '.join('%'*len(ids_list)) # "?, ?, ?, ... ?"
query = …
Run Code Online (Sandbox Code Playgroud) 首先,对于模糊的主题名称感到抱歉(我想不出更好的东西)。
一个 SO 答案让我思考当我放弃=
IN 时是否真的会对性能产生影响。
select 1 id, 'abc' name into #a union
select 2, 'abcd' union
select 3, 'abcde'
select * from #a where id = 1 ------ Query 1
select * from #a where id in (1)------ Query 2
Run Code Online (Sandbox Code Playgroud)
我检查了这两个查询的查询计划,发现它们对我来说是相同的(也许这个例子很简单,可能这就是原因)。
但是使用 时我是否违反了任何性能最佳实践IN
?当然,这肯定会涉及一些开销,因为 anIN
可以处理多个项目,甚至SELECTS
. 我知道IN
在功能方面提供了更多,但对于有多个记录的情况id = 1
,
select * from #a where id = (SELECT id from #a where id = 1)------ Query 3
select …
Run Code Online (Sandbox Code Playgroud) 你好,
我在将参数传递给“IN”子句时遇到问题。我正在使用以下查询。
询问:
SELECT Topics.Topic_Id FROM Topics
Where Topic_Description IN (''+ @Topics +'')
Run Code Online (Sandbox Code Playgroud)
当参数具有单个值时,此查询有效。我的参数可以有逗号分隔的多个值,例如:“一”、“二”、“三”、“四”。但是只要有多个参数,查询就会失败。如何克服这个?请建议。
谢谢
我必须将上述内容用作存储过程的一部分。我必须将选择查询的结果放入如下游标中:
DECLARE cur_TopicIDs CURSOR FOR SELECT Topics.Topic_Id FROM Topics Where Topic_Description IN (''+ @Topics +'')....等
在这种情况下,我如何按照其他链接中的建议使用动态 sp
SELECT *
FROM Tabl tabb
WHERE (tabb.col1, tabb.col2) IN ( (1,2), (3,4))
Run Code Online (Sandbox Code Playgroud)
上面的工作在Oracle中,但我试图在一个专有的SQL引擎中运行,该引擎不支持在IN中使用多个列进行上述查询.
我试图在DB中找到1,2和3,4的组合.
请帮助我实现上述任何替代方案.
我正在寻找一次从Java传递col1和col2的值列表的方法,因此'='可能不是一个选项,因为它可能需要两个SQL语句来实现上述目的.
我需要有关 sql 查询性能的帮助...
我有一个视图,当我运行视图时
select *
from udv_salesAnalyze
where _month=12 and _year=2012
Run Code Online (Sandbox Code Playgroud)
我在 2 秒内得到结果
但是当我添加另一个过滤器时
select * from udv_salesAnalyze
where _month=12 and _year=2012
and userRef in (1,2,5,6,9,11,12,13,14
,19,22,25,26,27,31,34,35,37,38,39,41,47,48,49,53,54,57,59,61,62
,65,66,67,68,69,70,74,77,78,79,80,83,86,87,88,90,91,92,94)
Run Code Online (Sandbox Code Playgroud)
我在 1 分 38 秒内得到了结果..
我将查询修改为
select * from udv_salesAnalyze
where _month=12 and _year=2012
and userRef in (select * from udf_dependedUsers(2))
Run Code Online (Sandbox Code Playgroud)
(这里 udf_dependedUsers 是表返回的函数)我在 38 秒内得到了结果
我加入了 table retuned 函数来查看,但我再次在 38-40 秒内得到了结果......
有没有其他方法可以更快地获得结果...
我会很感激你能给我一个解决方案......
多谢 ...
这里是 udf_dependedUsers 的代码:
ALTER FUNCTION [dbo].[udfn_dependedUsers] (@userId int)
RETURNS @dependedUsers table (userRef int)
AS …
Run Code Online (Sandbox Code Playgroud) 我在 MySQL 中有一个表,其中有一个字段“class_id”。我需要编写一个查询,返回使用 IN 子句列表中的每个值按降序时间顺序排序的前 15 行。
查询解释:
select * from table_x where class_id IN (1,2,3) sort by time_x desc limit 15;
Run Code Online (Sandbox Code Playgroud)
在上面的示例查询中,我需要获取按降序时间顺序排序的每个 class_id(1,2 和 3)的前 15 行。
in-clause ×10
mysql ×3
sql ×3
sql-server ×2
c# ×1
dynamic ×1
expression ×1
in-operator ×1
java ×1
javascript ×1
limit ×1
linq ×1
mybatis ×1
optimization ×1
parameters ×1
performance ×1
python ×1
variables ×1
where-clause ×1
xml ×1