我需要在SQL Server中创建一个查询,其中搜索条件将包括/排除基于用户输入的表.
说我有两个表,TABLE_A并TABLE_B用列KEYCOLUMN_A,并COLUMN_A在TABLE_A与列FKCOLUMN_B和COLUMN_B的TABLE_B.
和查询一样:
SELECT TABLE_A.* FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
AND TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '%SEARCH2%'
Run Code Online (Sandbox Code Playgroud)
现在,如果用户没有输入SEARCH2,我不需要搜索TABLE_B.但这意味着一个IF ELSE条款.而作为"可选"表中查询数量的增加,排列组合也将增加,会有许多IF和ELSE报表.
相反,我决定保持声明不变.因此,如果SEARCH2为空,则查询将有效地变为:
SELECT * FROM TABLE_A, TABLE_B WHERE TABLE_A.KEYCOLUMN_A = TABLE_B.FKCOLUMN_B
AND TABLE_A.COLUMN_A LIKE '%SEARCH%' AND TABLE_B.COLUMN_B LIKE '% %'
Run Code Online (Sandbox Code Playgroud)
SQL优化器能够识别出LIKE %%与删除条件本身一样好吗?
我无法使用类似的语句来处理空格和尾随通配符.我的查询如下:
select * from Table where Field like 'Desc_%'
数据以空格分隔,例如Desc Top,Desc Bottom等.当我使用模式'Desc_%'时查询有效,但当我使用模式'Desc%'时查询无效.该字段为nvarchar(255).
有任何想法吗?
编辑
事实证明数据是制表符分隔的,当我从2008 Management Studio复制一个值时,它将选项卡转换为空格.愚蠢的错误.我确实喜欢[]提示,所以我给它标记了答案.谢谢大家,我会记得不相信网格结果中的副本.
如果字段是AES_ENCYPTED,我将如何使用WHERE和LIKE serach执行Mysql SELECT?
例:
SELECT AES_DECRYPT(place,'"+salt+"'),AES_DECRYPT(web_address,'"+salt+"')
FROM access
WHERE place= LIKE '%(AES_ENCRYPT('"+searchStr+"','"+salt+"'))',%')
Run Code Online (Sandbox Code Playgroud)
基本上,在加密列上执行搜索,并在两端使用LIKE通配符 $searchStr
嗨,我担心如何实现一个简单的搜索查询,我的方案是:
tag VARCHAR 255
Run Code Online (Sandbox Code Playgroud)
现在我需要在标签字段内搜索,我可以使用两种查询:
SELECT * FROM table WHERE tag LIKE '%1111%' OR LIKE '%2222%' OR LIKE '%3333%';
Run Code Online (Sandbox Code Playgroud)
要么
SELECT * ,MATCH(tag) AGAINST('+1111','+2222','+3333' IN BOOLEAN MODE) as score FROM table ORDER BY score DESC ;
Run Code Online (Sandbox Code Playgroud)
哪个更准确/更准确哪个更快?
谢谢
我有这个:
query = query.Where(s => s.ShowTypeDescription == showTypeDescription);
Run Code Online (Sandbox Code Playgroud)
为了构建动态SQL,为了不同的变量多次.
我将如何改变以上内容来说:
query = query.Where(s => s.ShowTypeDescription **LIKE** showTypeDescription);
Run Code Online (Sandbox Code Playgroud)
?
如果查看LIKE运算符的定义,您将看到有一个名为的可选参数ESCAPE,其描述如下:
是一个放在通配符前面的字符,表示通配符应该被解释为常规字符而不是通配符.escape_character是一个没有默认值的字符表达式,必须只计算一个字符.
因此,当您编写WHERE如下所示的子句时,您告诉SQL Server引擎将感叹号视为转义字符(就像'\'C#中的字符一样)以列出包含'30%'子字符串的注释:
WHERE comment LIKE '%30!%%' ESCAPE '!'
Run Code Online (Sandbox Code Playgroud)
现在这里让我感到困惑.已经可以通过将它们放在方括号内来转义通配符.为什么要引入这个ESCAPE论点呢?我猜这是有原因的.
编辑:我看到几个解释如何ESCAPE工作的答案.我知道这ESCAPE用于逃避通配符,但我也知道你可以使用方括号来逃避那些通配符.我只是想了解"ESCAPE方法"有什么,"方括号方法"没有.
编辑2:虽然Szymon的例子完全有效,但我觉得这不是引入ESCAPE的唯一原因.我当然可能错了,但我怀疑可能存在一些基于性能的原因,我不确定.Szymon,你可以达到如下相同的效果:
DECLARE @TEST_STRING VARCHAR(100) = 'ddd]eee';
SELECT 'MATCHED! (Szymon)' WHERE @TEST_STRING LIKE '%[abc!]]%' ESCAPE '!';
SELECT 'MATCHED! (Altern)' WHERE @TEST_STRING LIKE '%[abc]%' OR @TEST_STRING LIKE '%]%';
Run Code Online (Sandbox Code Playgroud)
作为旁注,您不需要转义结束方括号字符.
我的MySQL数据库中有很多书.我正在寻找具体的书头.例如,我知道如何找到每个标题以"dan"开头:
SELECT * FROM books WHERE header LIKE 'dan%';
Run Code Online (Sandbox Code Playgroud)
但是如何在标题内找到以某个短语开头的单词(substring)?
提前致谢.
如果[column1]被索引,则下一个查询可能使用索引:
SELECT * FROM [table] WHERE [column1] LIKE 'starts%'
Run Code Online (Sandbox Code Playgroud)
如果我引入一个变量,下面的查询永远不会使用索引:
DECLARE @starts nvarchar(100)
SET @starts = 'starts%'
SELECT * FROM [table] WHERE [column1] LIKE @starts
Run Code Online (Sandbox Code Playgroud)
我想根据用户输入实现StartsWith搜索,我不知道选择何种方式:
为LIKE正确转义用户输入,以便优化器能够根据文字选择一个计划
使用WITH(FORCESEEK)
这是我的情景.
SQL Server 2014标准版,我有一个具有SQL_Latin1_General_CP437_BIN2区分大小写的排序规则的数据库.
我想执行一个LIKE查询,它应该返回输出而不管区分大小写.
例如:如果我执行Like查询以使用userName'John'获取记录,它也应该返回行,而不管区分大小写"JOHN","John","john","joHN".
我尝试使用Lcase,Ucase但是我收到了错误
Msg 195,Level 15,State 10,Line
4'LCASE'不是公认的内置函数名.
这是我的示例查询
SELECT TOP 300 *
FROM
(SELECT
userNo, userName, Place, Birthdate
FROM usertable
WHERE personid = 2
AND (Name LIKE LCASE('%john%'))
UNION
SELECT
userNo, userName, Place, Birthdate,
FROM usertable2
WHERE personid = 2
AND (Name LIKE LCASE( '%john%') OR Place LIKE LCASE('%NY%')) ) a
ORDER BY
userNo
Run Code Online (Sandbox Code Playgroud)
伙计们帮助我提出宝贵的建议,我对使用基于校对的数据库感到困惑.
sql-server collation case-insensitive sql-like sql-server-2014
我应该如何在Python中为SQLite3进行真正的转义?
\n\n如果我用谷歌搜索它(或搜索 stackoverflow),就会有大量的问题,每次的回答都是这样的:
\n\ndbcursor.execute("SELECT * FROM `foo` WHERE `bar` like ?", ["foobar"])\nRun Code Online (Sandbox Code Playgroud)\n\n这有助于防止 SQL 注入,如果我只用“=”进行比较就足够了,但它当然不会删除通配符。
\n\n所以如果我这样做
\n\ncursor.execute(u"UPDATE `cookies` set `count`=? WHERE `nickname` ilike ?", (cookies, name))\nRun Code Online (Sandbox Code Playgroud)\n\n一些用户可以为昵称提供“%”,并用一行替换所有 cookie 条目。 \n我可以自己过滤它(呃\xe2\x80\xa6 无论如何,我可能会忘记那些鲜为人知的通配符之一) ,我可以在昵称和昵称上使用小写字母,并将“ilike”替换为“=”,但我真正想做的是:
\n\nfoo = sqlescape(nick)+"%"\ncursor.execute(u"UPDATE `cookies` set `count`=? WHERE `nickname` ilike ?", (cookies, foo))\nRun Code Online (Sandbox Code Playgroud)\n