全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3096
推到 Plurk!
推到 Facebook!

SELECT的複數如何填在EDIT,並以逗號為區隔

答題得分者是:careychen
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-02 16:00:03 IP:122.116.xxx.xxx 訂閱
小弟寫段SQL 

SELECT PART
FROM TABLE

PART
1
2
3
.以此類退

然後要把PART 的值 放在 EDIT 上面
如果SELECT 出來只有一各PART 放EDIT 沒問題

如果SELECT 出來有兩各以上
小弟該怎麼寫才可以都顯示在EDIT上 並且以逗號為區隔呢

1,2,3 <-- 像這樣顯示在同一格EDIT1


以下為原始碼

[code delphi]
SELECT PART FROM TABLE

Edit1.Text := ClientDataSet1.FieldByName('PART').AsString;
[/code]
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
編輯記錄
lovemari 重新編輯於 2008-12-02 16:00:43, 註解 無‧
foxelf
初階會員


發表:9
回覆:42
積分:30
註冊:2003-03-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-02 16:41:34 IP:118.168.xxx.xxx 訂閱
最簡單的方式就是用迴圈去做了

===================引 用 lovemari 文 章===================
小弟寫段SQL

SELECT PART
FROM TABLE

PART
1
2
3
.以此類退

然後要把PART 的值 放在 EDIT 上面
如果SELECT 出來只有一各PART 放EDIT 沒問題

如果SELECT 出來有兩各以上
小弟該怎麼寫才可以都顯示在EDIT上 並且以逗號為區隔呢

1,2,3 <-- 像這樣顯示在同一格EDIT1


以下為原始碼

[code delphi]
SELECT PART FROM TABLE

Edit1.Text := ClientDataSet1.FieldByName('PART').AsString;
[/code]
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-02 16:41:45 IP:60.248.xxx.xxx 訂閱
HI, 有兩種方式,參考看看

第一種,使用 SQL
[code delphi]
with ADOQuery1 do
begin
SQL.Text := 'Declare @sPart varchar(1000); Set @sPart = '';'
'Select @sPart=@sPart Cast(Part as varchar(10)) '','' from Table;'
'Select SubString(@sPart, 1, Len(@sPart)-1) Part';
Open;
Edit1.Text := FieldByName('PART').AsString;
Close;
end;
[/code]

第二種,使用 Delphi 本身
[code delphi]
with ADOQuery1 do
begin
SQL.Text := 'SELECT PART FROM TABLE';
Open;

while Not Eof do
begin
Edit1.Text := Edit1.Text FieldByName('PART').AsString ',';
Next;
end;
Close;
if (Edit1.Text <> '') then
Edit1.Text := Copy(Edit1.Text, 1, Length(Edit1.Text)-1);
end;
[/code]

===================引 用 lovemari 文 章===================
小弟寫段SQL

SELECT PART
FROM TABLE

PART
1
2
3
.以此類退

然後要把PART 的值 放在 EDIT 上面
如果SELECT 出來只有一各PART 放EDIT 沒問題

如果SELECT 出來有兩各以上
小弟該怎麼寫才可以都顯示在EDIT上 並且以逗號為區隔呢

1,2,3 <-- 像這樣顯示在同一格EDIT1


以下為原始碼

[code delphi]
SELECT PART FROM TABLE

Edit1.Text := ClientDataSet1.FieldByName('PART').AsString;
[/code]
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-12-02 16:43:44, 註解 無‧
careychen 重新編輯於 2008-12-02 16:44:33, 註解 無‧
douglas
初階會員


發表:24
回覆:42
積分:38
註冊:2008-03-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-02 16:49:47 IP:59.125.xxx.xxx 未訂閱
ADOQuery.First 回到第一筆
ADOQuery.Next 跳下一筆
ADOQuery.Eof 可以用來判斷資料是否到最後一筆

再來搭配迴圈,應該可以達到你要的結果

例:
while not ADOQuery.Eof do
begin
...(處理程序)
ADOQuery.Next;
end;
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-02 18:14:31 IP:122.116.xxx.xxx 未訂閱
您好,

mysql 有一個 group_concat 可以用

oracle 的話

with data as ( select part from table)
select sys_connect_by_path(part,',') part
from data

我現在沒空實測, 參考一下

==========================================================
雖已結案, 但仍然修改一下內容, 我覺得有參考價值, 又可留在這裡當成我的筆記 :

我實測了上述方法, 並不成功, 我會再測
我另外找到一個方法, 實測可行, 先整個 post 上來, 再看看有無方法寫得更簡潔 :

1. 先 create 一個 function
CREATE OR REPLACE FUNCTION matrix (query_in in VARCHAR2) RETURN VARCHAR2 IS
incoming varchar2(4000);
hold_result varchar2(4000);
c sys_refcursor;
Begin
open c for query_in;
loop
fetch c into incoming;
exit when c%notfound;
hold_result := hold_result||','||incoming;
end loop;
return ltrim(hold_result,',');
END;
/
2. 呼叫
select matrix('select part from table order by part') parts from dual;

仔細看的結果, 發覺和用 delphi 來做後製作 的邏輯類似
只是他是寫在 oracle 端, 不同於一般寫在 delphi 端
寫成 oracle 端的 function 有好處, 就是 delphi 或其他 client 端 直接使用即可, 不必每次都要寫一段相類似的邏輯.

==========================================================
另一個方法也試出來了
Select Substr(Sys_Connect_By_Path(part, ','), 2)
From (Select Rownum Rid, Rownum 1 Next_Rid, part From table)
Where Rid = (Select Count(*) From table)
Start With Rid = 1
Connect By Prior Next_Rid = Rid


===================引 用 lovemari 文 章===================
小弟寫段SQL

SELECT PART
FROM TABLE

PART
1
2
3
.以此類退

然後要把PART 的值 放在 EDIT 上面
如果SELECT 出來只有一各PART 放EDIT 沒問題

如果SELECT 出來有兩各以上
小弟該怎麼寫才可以都顯示在EDIT上 並且以逗號為區隔呢

1,2,3 <-- 像這樣顯示在同一格EDIT1


以下為原始碼

[code delphi]
SELECT PART FROM TABLE

Edit1.Text := ClientDataSet1.FieldByName('PART').AsString;
[/code]
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-12-04 13:37:00, 註解 無‧
st33chen 重新編輯於 2008-12-04 13:44:16, 註解 無‧
st33chen 重新編輯於 2008-12-04 13:46:12, 註解 無‧
st33chen 重新編輯於 2008-12-08 09:23:26, 註解 無‧
st33chen 重新編輯於 2008-12-08 09:24:41, 註解 無‧
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-03 08:34:02 IP:122.116.xxx.xxx 訂閱

首先 先謝謝各位抽空回答小弟
因為小弟一試careychen 大大的方法就一次ok

所以小弟結案給了他

再次感謝

===================引 用 careychen 文 章===================

第二種,使用 Delphi 本身
[code delphi]
with ADOQuery1 do
begin
SQL.Text := 'SELECT PART FROM TABLE';
Open;

while Not Eof do
begin
Edit1.Text := Edit1.Text FieldByName('PART').AsString ',';
Next;
end;
Close;
if (Edit1.Text <> '') then
Edit1.Text := Copy(Edit1.Text, 1, Length(Edit1.Text)-1);
end;
[/code]
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
系統時間:2024-05-07 3:41:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!