2016-09-19 55 views
1

我有一行记录在我的db abc表中,col1的值为'00'。修整值在SQL条件

要求:'00'等于'12345',修整前面的所有'0'。

这里是我的sql查询:

SELECT * FROM abc WHERE col1 = '12345'; 

此查询不会返回我的任何结果,除非我将其更改为

SELECT * FROM abc WHERE col1 LIKE '%12345'; 

但是,这将打破规则,例如,如果我的价值在db中为'00912345', ,那么在修整前面的所有'0'之后'00912345'不等于'12345'。

请注意如何在进行比较时修改db中的值。

+0

的[删除导致可能的复制0](http://stackoverflow.com/questions/9091297/remove-leading-zeros) – Damirchi

+1

为什么你在字符列中存储整数值? – jarlh

+0

使用下面的语法 从table_1中选择*其中LTRIM(名称,'0')='12345'; – Jack

回答

0

您可以尝试铸造col1为数值类型(例如int),然后检查平等:

SELECT * 
FROM abc 
WHERE CAST(col1 AS INT) = 12345 

但如果col1是存储数字数据,它可能会更有意义的是列转换为数字类型,而不是VARCHAR

0

你已经标记了这个DB2,所以我假设你在遵循DB2语法。这是

select * from abc where cast(col1 as integer) = 12345 
0

根据您的版本和平台,你可以试试这个:

WHERE TRIM(L '0' FROM col1) = '12345' 

或者这样:

WHERE LTRIM(col1, '0') = '12345' 
0

解决方案,其在DB2 V9工作

SELECT * FROM ABC WHIM TRIM(L'0'from col1)='12345'

在DB2 v10中,应该也可以使用LTRIM

0

在我的估计中,OP以不正确的视角解决了难题。

考虑到数据的存储方式是已知的,那么只需正确组合文字以匹配关于如何存储数据的规则。从数据库中存储的每个值中修剪前导零,或者转换每个值以匹配数字类型的值以供选择是IMO,这是一个糟糕的实现。

我们[读者]可能最好假设的文字会根据用户输入现身,因此责任不能被放置在任何用户(S)重新格式化它们的输入相匹配的数据库。因此,不是用户正确组成文字值,下一个最好的方法是让程序员修改文字选择值以匹配数据的存储方式。

如果字符串值'12345'是指定的[用户输入]值,那么可以在查询中编写一个表达式,该表达式可修改只有该字面值。这可以做,而不是组成一个表达式来投射列和\或可能也投射文字。例如,下面的吉文斯,在可能的查询的WHERE子句变种之一下面进一步显示应该是有帮助[使用SQL变量语法表达]:

create variable literal_replacement varchar(8) default '12345' 
; /* used in place of actual literal string value as user input */ 
create table abc 
(col1 char(08) 
) /* My interpretation, as per typical, the OP offers no DDL */ 
; 
create function col1_compare_val 
(string_val varchar(08)) 
returns char(08) 
language sql 
return right('00000000' concat string_val, 8) 
; /* possible example of encapsulating code to reformat user input */ 


WHERE col1 = repeat('0', 8 - length(literal_replacement)) concat literal_replacement 

WHERE col1 = (lpad(literal_replacement, 8, '0')) 

WHERE col1 = right('00000000' concat literal_replacement , 8) 

WHERE col1 = col1_compare_val(literal_replacement)