2013-03-12 91 views
0

我沒有任何運氣使這項工作,我不知道我失蹤。我剛接觸Coldfusion和SQL,但仍在學習。使用子字符串評估表值與領先零零一

我有一個綁定,我正在做一個窗體。用戶選擇需要的服務類型後,生成位於另一個表中的名稱。我遇到的問題是服務類型正在使用位於兩個表中的服務編號。然而,在一張表格中,創建者爲該數字添加了前導零。例如,一個表將有205,另一個表將有0000205我需要比較這些以獲得我想要的名稱值。這是我迄今爲止的編碼。這是使用Coldfusion和Java。所謂

CFC文件servicetype2

<cffunction name="getServiceType2" access="remote" returnType="array"> 
<cfargument name="CATG_NAME" type="string" required="true"> 

<cfset var data=""> 
<cfset var result=ArrayNew(2)> 
<cfset var i=0> 


<cfquery name="getServiceType2" datasource="SOME DATABASE"> 
select 1 AS SortBy, '' AS SRTY_NBR, '' AS SRTY_NAME 
from SOME TABLE 
UNION 
select distinct 2 AS SortBy, SRTY_NBR, SRTY_NAME 
from SOME TABLE 
where CATG_NAME = <cfqueryparam value="#ARGUMENTS.CATG_NAME#" cfsqltype="cf_sql_varchar"> AND EVLN_REQD_FLAG IS NOT NULL 
order by SortBy 
</cfquery> 

<cfloop index="i" from="1" to="#getServiceType2.recordcount#"> 
<cfset result[i][1]=getServiceType2.SRTY_NAME[i]> 
<cfset result[i][2]=getServiceType2.SRTY_NAME[i]> 
</cfloop> 

<cfreturn result> 
</cffunction> 

//Table 2 
<cffunction name="getUnion" access="remote" returnType="array"> 
<cfargument name="SRTY_NBR" type="string" required="true"> 


<cfset var result=ArrayNew(1)> 

<cfquery name="union_rq" datasource="SOME DATABASE"> 
select UNI_NAME, substring(SRTY_NBR, patindex('%[^0]%',SRTY_NBR),10) 
from SOME TABLE 
where substring(SRTY_NBR, patindex('%[^0]%',SRTY_NBR),10) 
    = <cfqueryparam value="#ARGUMENTS.SRTY_NBR#" cfsqltype="cf_sql_varchar"> 
</cfquery> 

<cfset result[1]=union_rq.UNI_NAME> 

<cfreturn result> 
</cffunction> 

的代碼是在我的形式是:

 <tr id="serv_ty2" style="display: inline;"> 
<td></td> 
<td>Select Service: 
    <cfselect name="service_type" 
    bind="cfc:servicetype2.getServiceType2({catdesc})" 
bindonload="false"/></td> 
</tr> 


    <tr id="union" style="display: inline;"> 
<td></td> 
<td>Union Attached: 
<cfinput name="uni_name" 
    bind="cfc:servicetype2.getUnion({service_type})" 
bindonload="false" 
/></td> 
</tr> 

再次綁定工作正常,但我不能想出的名字和我肯定它與我的SQL語句對比205到0000205有關。任何關於如何讓sql語句工作的建議都會很棒。如果您發現綁定的任何其他錯誤,那也會很好。 非常感謝您提供任何建議。

+0

下面的答案是一個很好的解決方案。但是,現在也應該指出,如果數據類型設置正確,那麼0000205,00205,205全都匹配205,反之亦然。在MySQL中,這也是存儲成本的一半。使用介質int每行4個字節,每個char 1個字節的varchar(7)(可能更多)使用每行8個字節的double,每個char 1個字節(總共7個)和1個字節來記錄長度。開始真正的快速加起來,這一切都是爲了一堆零。 – 2013-03-13 00:38:22

回答

2

您可以使用NumberFormat()在查詢

WHERE srty_nbr IN (<cfqueryparam  
    value="#ARGUMENTS.SRTY_NBR#,#NumberFormat(ARGUMENTS.SRTY_NBR,'0000000')#" 
    cfsqltype="cf_sql_varchar" list="true"> 

#NumberFormat(ARGUMENTS.SRTY_NBR,'0000000')#將確保每一個數字都有7個位數與前導零。

+0

對此不確定。如果arguments.srty_nbr是一個數字列表,比如1,2,3,那麼numberformat可能不會做你想要的。另一方面,如果它是一個單一的數字,那麼=比()中的要好。 – 2013-03-12 17:41:02

+0

@DanBracuk他說這是一個數字,而IN是因爲它檢查了205和0000205. – 2013-03-12 17:46:16

1

最好的辦法是將值轉換爲SQL級別。這很容易通過將列的選擇更改爲:SELECT ..., CAST(SRTY_NBR AS UNSIGNED) ...這將截斷前導零。

+0

我絕對同意這一點。除非有理由將前導零帶入查詢輸出,否則讓SQL服務器完成它的工作。 SQL服務器通常在處理像這樣的數據方面更好。讓它將數據作爲整型進行CAST處理,並且比較起來更加簡單和高效。就個人而言,除非有充分理由以這種方式存儲數據,否則我認爲這是糟糕的數據庫設計。 – Shawn 2013-03-14 00:11:54