我有一个BIGINT列,我想要进行部分匹配。
e.g。 @search = 1
应返回第一个数字为1(1,11,100等)的所有记录。基本上与varchar LIKE相同。
我试过了:
DECLARE @search VARCHAR
SET @search = '1'
和
SET @search = '1%'
用过:
SELECT
id FROM table
WHERE
CAST(id AS varchar) LIKE @search
将%
添加到@search
无济于事。任何想法如何实现这一目标?
WHERE
子句中对字符串进行硬编码,我会得到我正在寻找的结果。
SELECT id FROM table WHERE CAST(id AS VARCHAR) LIKE '14%'
这给了我所有记录的id
为14 *(14,140,1400等)。
答案 0 :(得分:6)
请改为尝试:
DECLARE @search VARCHAR(10)
SET @search = '1'
SELECT id FROM table WHERE CAST(id AS VARCHAR(10)) LIKE @search + '%'
转换为VARCHAR
时,您应始终指定长度。如果您没有定义长度,SQL-Server将为您分配一个长度。有时它会是1
其他人30
。请阅读this以获取更多信息。
答案 1 :(得分:3)
不使用LIKE
运算符,而是尝试使用LEFT函数。这将返回具有指定字符数的字符串的左侧部分。
SELECT id
FROM table
WHERE LEFT(CAST(id AS varchar), 1) = '1'
我不确定,但我必须假设这比使用LIKE
运算符有更好的性能,特别是因为你知道你只想比较起始字符。通常在WHERE子句中使用函数通常会导致性能不佳,因为查询无法利用列上可能存在的任何索引。但是在这种情况下,查询调用CAST函数,因此索引的好处已经丢失。
编辑:如果需要对可变位数进行比较,则可以使用LEN函数确定要返回的LEFT函数的字符数。
SELECT id
FROM table
WHERE LEFT(CAST(id AS varchar),LEN(@search)) = @search
答案 2 :(得分:3)
不是喜欢但应该这样做。将x替换为id。
<div class='ClassName'>
<div class="col_Num">1 </div>
<div class="col_Val">5.00 </div>
</div>
<div class='ClassName'>
<div class="col_Num">2 </div>
<div class="col_Val">2.00 </div>
</div>
答案 3 :(得分:2)
问题在于您的@search
。请尝试以下代替
create table aaa (id bigint);
insert into aaa values(1),(11),(100),(111),(1111),(2222);
选择查询
SELECT
id FROM aaa
WHERE
CAST(id AS varchar(1000)) LIKE '1%';
(或)如下
DECLARE @search VARCHAR;
SET @search = '1';
SELECT
id FROM aaa
WHERE
CAST(id AS varchar(1000)) LIKE @search + '%';
答案 4 :(得分:1)
有一种方法可以在不转换为VARCHAR(30)
的情况下执行此操作 - 但我没有测试它以查看性能是否真的更好。 LOG10()
并不便宜,但整数除法是。所以测试是有道理的。
假设:
create table aaa (id bigint);
insert into aaa values(1),(11),(100),(111),(1111),(2222),(1234),(4531),(1345134),(64513),(6451999123);
declare @want int = 64 -- and these are your starting digits
疯狂的数学:
select id
from dbo.aaa
WHERE id / (CASE WHEN (LOG10(id) -CEILING(LOG10(@want))) > 1
THEN POWER(10 , CEILING(log10(id-1)-CEILING(LOG10(@want))) )
ELSE 1 END) = @want;
基本上,LOG10()
对确定向右移位的位数(通过整数除法),以便只保留所需的位数。
答案 5 :(得分:0)
这可能有所帮助:
like 1%
相当于:任何更大或等于10,如果您要比较数字。
因此,您可能需要执行以下操作:
SELECT
id FROM table
WHERE
id >= @search*10 --@Search is of course int