在这里的帖子中,我学习了如何使用Linq的延迟执行来构建动态查询.但查询实际上是使用WHERE条件的AND连接.
如何使用OR逻辑实现相同的查询?
由于Flags枚举,查询应搜索Username,WindowsUsername或两者:
public User GetUser(IdentifierType type, string identifier)
{
using (var context = contextFactory.Invoke())
{
var query = from u in context.Users select u;
if (type.HasFlag(IdentifierType.Username))
query = query.Where(u => u.Username == identifier);
if (type.HasFlag(IdentifierType.Windows))
query = query.Where(u => u.WindowsUsername == identifier);
return query.FirstOrDefault();
}
}
Run Code Online (Sandbox Code Playgroud) 希望这似乎不太简单.我已经看了这个,但我不太擅长SQL用户定义的函数及其使用,所以我不确定发生了什么.为了告诉我为什么我收到错误,他们想了几点:
在期望条件的上下文中指定的非布尔类型的表达式,在')'附近.
为了这:
UPDATE LMI_Contact
SET Phone = NULL
WHERE dbo.LMI_IsSingleCharacterRepeated(Phone, '0')
Run Code Online (Sandbox Code Playgroud)
可以使用以下方法创建函数:
-- ***this will also find NULL and empty string values***
CREATE FUNCTION LMI_IsSingleCharacterRepeated (@string varchar(max), @char char(1))
RETURNS bit
AS
BEGIN
DECLARE @index int
DECLARE @len int
DECLARE @currentChar char(1)
SET @index = 1
SET @len= LEN(@string)
WHILE @index <= @len
BEGIN
SET @currentChar = SUBSTRING(@string, @index, 1)
IF @currentChar = @char
SET @index= @index+ 1
ELSE
RETURN 0
END
RETURN 1
END;
GO
Run Code Online (Sandbox Code Playgroud)
此函数用于检查字符串是否是任何指定的单个字符,重复.希望有人发现它有用!
我想知道是否有一种方法可以在WHERE子句中使用用户定义的变量,如下例所示:
SELECT id, location, @id := 10 FROM songs WHERE id = @id
Run Code Online (Sandbox Code Playgroud)
此查询运行时没有错误,但无法按预期工作.
如果更新的版本不会违反主键约束,我想更新我的 postgres 数据库中的行。如果可以,我想保持原样。
假设表有主键col1, col2, col3,如果我运行这样的查询:
UPDATE table SET (col1, col2) = ('A', 'B')
WHERE col1='D' AND col2='E';
Run Code Online (Sandbox Code Playgroud)
查询将失败,如果存在两个条目,我将收到重复键错误:
'A', 'B', 'C'
'D', 'E', 'C'
Run Code Online (Sandbox Code Playgroud)
即col3在现有行和要更新的行之间是相同的。
如果我正在INSERT使用我会使用的行,ON CONFLICT DO NOTHING但我找不到它的实现UPDATE。是否存在等价物?
是否可以使用类似于Scala中where-clauses的内容?也许有一些我没想到的伎俩?
编辑:
感谢您的所有答案,我们非常感谢.总结一下:局部变量,vals和defs可以用来实现几乎相同的东西.对于惰性求值,可以使用lazy val(带隐式缓存)或函数定义.确保功能纯度留给程序员.
现在只剩下一个问题:是否有一种方法可以在使用它们的表达式之后放置值或函数定义?有时这似乎更清晰.这可以使用类或对象的字段/方法,但它似乎不适用于方法.
到目前为止,答案中没有提到另一件事.where-clause也限制了它们中定义的表达式的范围.我还没有找到在Scala中实现这一目标的方法.
我一直在争夺这一个.我有一个存储过程,它接受3个用于过滤的参数.如果传入特定值,我想对其进行过滤.如果传入-1,请全部给我.
我试过以下两种方式:
第一种方式:
SELECT field1, field2...etc
FROM my_view
WHERE
parm1 = CASE WHEN @PARM1= -1 THEN parm1 ELSE @PARM1 END
AND parm2 = CASE WHEN @PARM2 = -1 THEN parm2 ELSE @PARM2 END
AND parm3 = CASE WHEN @PARM3 = -1 THEN parm3 ELSE @PARM3 END
Run Code Online (Sandbox Code Playgroud)
第二种方式:
SELECT field1, field2...etc
FROM my_view
WHERE
(@PARM1 = -1 OR parm1 = @PARM1)
AND (@PARM2 = -1 OR parm2 = @PARM2)
AND (@PARM3 = -1 OR parm3 = @PARM3)
Run Code Online (Sandbox Code Playgroud)
我读到某处,第二种方式会短路,如果是真的话,永远不会评估第二种方式.我的DBA说它强制进行表扫描.我还没有验证这一点,但在某些情况下似乎运行速度较慢.
此视图选择的主表有大约150万条记录,并且视图继续加入大约15个其他表以收集大量其他信息.
这两种方法都很慢......把我从瞬间带到2-40秒的任何地方,这在我的情况下是完全不可接受的.
是否有更好的方法不涉及将其分解为特定vs …
我有一个实体,它与另一个用@Where注释的实体有关联,就像这样
public class EntityA {
@OneToMany
@Where(...)
private List<EntityB> entityBList;
}
Run Code Online (Sandbox Code Playgroud)
最近不可避免的事情发生了,我需要加载不符合@Where子句的EntityB.我可以删除@Where注释,但它被大量使用,所以理想情况下我不想这样做.除了手动加载EntityB的列表,还有另一个查询,我的选择是什么?我可以告诉Hibernate忽略@Where注释吗?
假设您有一个观点:
CREATE VIEW dbo.v_SomeJoinedTables AS
SELECT
a.date,
a.Col1,
b.Col2,
DENSE_RANK()
OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something
FROM a JOIN b on a.date = b.date
Run Code Online (Sandbox Code Playgroud)
我发现了以下的表现:
SELECT *
FROM v_SomeJoinedTables
WHERE date > '2011-01-01'
Run Code Online (Sandbox Code Playgroud)
比...差很多
SELECT *,
DENSE_RANK()
OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something
FROM a JOIN b ON a.date = b.date
WHERE a.date > '2011-01-01'
Run Code Online (Sandbox Code Playgroud)
我很惊讶这两个语句的查询计划不一样.
我也尝试使用内联表值函数,但查询仍然比我复制和粘贴视图逻辑的代码长100-1000倍.
有任何想法吗?
我知道他们没有跨越模式匹配(即你需要为每个模式重写'where'子句),但是范围如何适用于守卫?
这有用吗?
myFunction x1 x2
| x1 > x2 = addOne x1
| x1 < x2 = addOne x2
| otherwise = x1
where addOne = (1+)
Run Code Online (Sandbox Code Playgroud)
或者应该是这样吗?
myFunction x1 x2
| x1 > x2 = addOne x1
where addOne = (1+)
| x1 < x2 = addOne x2
where addOne = (1+)
| otherwise = x1
Run Code Online (Sandbox Code Playgroud) 你会如何使用'LIKE'来搜索子查询?
我试过这样做,但不起作用:
SELECT *
FROM mytable
WHERE name
LIKE '%
(SELECT name FROM myothertable)
%'
Run Code Online (Sandbox Code Playgroud)
到目前为止我有这个:
SELECT * FROM t1
WHERE t1.name IN (SELECT t2.name FROM t2)
AND (t1.title IN (SELECT t2.title FROM t2)
OR t1.surname IN (SELECT t2.surname FROM t2))
Run Code Online (Sandbox Code Playgroud)
它工作正常,因为它返回完全匹配,但它似乎没有返回我的其他相似的记录,所以我也想检查:
t1.title LIKE'%t2.title%'和t1.surname LIKE' %t2.surname%'
我该怎么做?
where-clause ×10
sql ×3
haskell ×2
mysql ×2
t-sql ×2
annotations ×1
boolean ×1
c# ×1
case ×1
function ×1
hibernate ×1
linq ×1
postgresql ×1
scala ×1
scope ×1
sql-insert ×1
sql-like ×1
sql-server ×1
sql-update ×1
subquery ×1