BIGINT列上的SQL Like / Contains

时间:2015-06-18 00:01:38

标签: sql sql-server tsql

我有一个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等)。

6 个答案:

答案 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