資料表名 sjb 欄位 wl(物料編碼) gg(規格)
輸入一個物料號查找出相應的規格
規格的格式 φ124×12×278 或 φ124×12
要求是搜索出所有規格相同的資料,問題是
φ124×12×278 相同規格例如 φ124×278×12 φ12×278×124
φ12×124×278 φ278×124×12 φ278×12×124
φ124×12 相同規格例如 12×124
uj5u.com熱心網友回復:
先把x前后的數字,全部改為按大小順序重擺如φ124×12一律改為φ12×124,而φ12×124就無須改——因為124大于12(可以是數值大小9<10,也可以是字串大小9>10)
不過,我更感興趣:為什么8年后還有delphi的活?
uj5u.com熱心網友回復:
select * from sjb where gg like '%12x124%' or gg like '%124x12% or gg like '%12x278%' or gg like %'124x278%' or ...uj5u.com熱心網友回復:
he delphi 沒關系吧,直接使用sql解決么;使用臨時表或許方便些,如果使用函式的話 估計會很慢的.uj5u.com熱心網友回復:
我本人的設想是 把規格分拆成124,12,278,然后再組合,最后用SQL寫問題是現在忘了怎么把φ124×12×278拆成3個數字,求代碼,分不夠可再加。
uj5u.com熱心網友回復:
最多3個數值?那使用臨時增加的3個數值欄位,寫sql也可能可以做到不過,最好還是程式遍歷逐行拆分、排序、update。。。。
uj5u.com熱心網友回復:
我本人的設想是 把規格分拆成124,12,278,然后再組合,最后用SQL寫問題是現在忘了怎么把φ124×12×278拆成3個數字,求代碼,分不夠可再加。要拆成3個數字,,只能一步一步分解,最好寫成存盤程序來呼叫。
DECLARE @str varchar(50),@str1 varchar(50),@str2 varchar(50),@str3 varchar(50),@xx int
SET @str='φ124×12×278'
SELECT @str=LTRIM(REPLACE(@str,'φ',' '))
SELECT @xx=charindex('×',@str)
SELECT @str1=Substring(@str,0,@xx)
SELECT @str=Substring(@str,@xx+1,Len(@Str)-@xx)
SELECT @xx=charindex('×',@str)
SELECT @str2=Substring(@str,0,@xx)
SELECT @str3=Substring(@str,@xx+1,Len(@Str)-@xx)
--print @str1
--print @str2
--print @str3
uj5u.com熱心網友回復:

這個是設計的問題吧。
uj5u.com熱心網友回復:
還是應該統一格式,并索引,可提高查詢效率。uj5u.com熱心網友回復:
根據你的描述:
需要對查詢條件做拆分組合, 如124×12×278, 可得以下因子(暫不考慮規格引數連接符的多樣性, 只認可×)
124, 12, 278(A, B, C)
可得6種組合 ABC, ACB, BAC, BCA, CAB, CBA
以這六種組合為查詢條件即可.
分拆規則可根據你的實際使用場景決定.
uj5u.com熱心網友回復:
最簡單有效的方法是在資料寫進資料庫之前,就對規格的引數做排序。這樣會簡單很多。uj5u.com熱心網友回復:
建議對規格字符進行排序。uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
樓主的要求是輸入 φ124×12×278 規格條件查詢,能把相關的規格都查出來吧可以在查詢前就拆分
部分代碼:
str:='φ124×12×278' ; // str=要查詢的規格
if Copy(str,1,1)='φ' then str:=Copy(str,2,Length(str)-1); // 去掉前面的φ符號
iPoint:=point('x',str); // 取第一個x的位置
if iPoint>0 then s1:=Copy(str,1,iPoint-1); // 第一個規格字串
str:=Copy(str,iPoint+1,Length(str)-iPoint);
iPoint:=point('x',str); // 取第二個x的位置
if iPoint>0 then
begin
s2:=Copy(str,1,iPoint-1); // 第二個規格字串
s3:=Copy(str,iPoint+1,Length(str)-iPoint); // 第三個規格字串
end
else
begin // 只有兩個字串的規格
s2:=str;
s3:='';
end;
查詢陳述句:
要分兩種情況,一種是s3不為空,一種是s3為空
if s3<>'' then // 一共9種組合
sql.text:='select * from sjb where (gg like ''%'+s1+'x'+s2+'x'+s3+'%'') or (gg like ''%'+s1+'x'+s3+'x'+s2+'%'') or ...'
end
else // 2種組合
sql.text:='select * from sjb where (gg =''φ'+s1+'x'+s2+''') or (gg =''φ'+s2+'x'+s1+''')';
uj5u.com熱心網友回復:
前面查詢陳述句有誤:都要用like ,因為有些有φ符號,有些沒有要分兩種情況,一種是s3不為空,一種是s3為空
if s3<>'' then // 一共9種組合
sql.text:='select * from sjb where (gg like ''%'+s1+'x'+s2+'x'+s3+'%'') or (gg like ''%'+s1+'x'+s3+'x'+s2+'%'') or ...'
end
else // 2種組合
sql.text:='select * from sjb where (gg like '%''+s1+'x'+s2+'%'') or (gg like '%''+s2+'x'+s1+'%'')';
uj5u.com熱心網友回復:
對規格字符必須排序uj5u.com熱心網友回復:
拆分不可行,因為規格引數個數未定。假如有5個引數呢,組合就是很多了uj5u.com熱心網友回復:
8年了, 這個不能解決?uj5u.com熱心網友回復:
我贊成13樓的。輸入時,只要不脫離大方向,φ124×12×278、φ124×278×12、φ12×124×278等都行。
查詢時,無論輸入上述幾種那一種都行。這樣對用戶特別方便(不要苛求用戶非按什么格式、順序輸入)。
編程者所要做的就是,在查詢前將φ124×12×278拆分成所有可能的組合,好像有6種?再查詢就行。
where (gg like ‘φ124×12×278’) or (gg like ‘φ124×278×12’) or (gg like ‘φ12×124×278’) or (gg like ...) or ...
uj5u.com熱心網友回復:
最好是增加一個欄位,將數字排序,這樣就好比較了,不然效率不行.uj5u.com熱心網友回復:
不知道這樣操作行不行1、先拆分資料欄位
2、建立臨時資料庫分段查詢資料,如先查第一個欄位建立第一次的結果,然后再這個結果中查詢第二個欄位
3、最后銷毀臨時資料庫
uj5u.com熱心網友回復:
先把輸入的字串按照X分成幾個片段(X就不算在里面了)譬如12X23X34,變成這么一個陣列12, 23, 34,然后查詢的時候就
where ...
( ('X'+field +'X') like ('%'+'X'+12+'X'+'%')
or ('X'+field +'X') like ('%'+'X'+23+'X'+'%')
or ('X'+field +'X') like ('%'+'X'+34+'X'+'%')
)
...
uj5u.com熱心網友回復:
sorry寫錯了,應該用and, 不是oruj5u.com熱心網友回復:
uj5u.com熱心網友回復:
我也是很久不做D的專案,還是財務方面的。頂你!uj5u.com熱心網友回復:
根據規格推斷,外徑,內徑,高度,可能是物料編碼人員未規范進行規格編碼造成的,
第一種方案,在生成查詢陳述句之前,把規格重新組合一遍,加入所有可能性。
第二種方案,查詢時,替換掉φ,再進行查詢
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/101760.html
標籤:數據庫相關
上一篇:請教下如何匯出dll中常量
下一篇:串口協議 校驗和怎么計算
