2011-09-03 63 views
-3

我正在使用SQL和PL/SQL。構造SQL查詢

我有一個單列「名稱」的表。該列中的數據是以分號分隔的字符串。我想要計算每行中元素的數量。

例如,如果表中有兩行,一個字符串爲'smith; black; tiger',另一個字符串爲'x; y',我希望查詢結果爲3第一行,第二行2。

我該如何編寫一個SQL查詢來計算分隔值列表中元素的數量?

+5

CSV數據庫中的列是一個非常糟糕理念。它沒有正常化,速度很慢,你不能使用索引,連接是一個痛苦。永遠不要這樣做。 – Johan

+0

什麼是您的數據庫平臺? – harpo

+0

數據庫表中沒有「第一行」。訂購從未得到保證。 –

回答

4

您可以使用此代碼

SQL代碼的恐怖

SELECT name 
     ,(LENGTH(COALESCE(vals,'')) 
     - LENGTH(TRANSLATE(COALESCE(vals,''), ';',''))) + 1 AS value_count 
FROM table1 
ORDER BY name 

備註
CSV在數據庫中是一個非常糟糕的反模式破解這個。
VALUES是一個保留字,在保留字之後命名列是一個壞主意。

6

你的問題很難理解,但我想你是說你有一個帶有「名稱」列的表格,並且在該列中,每個單元格包含多個由分號分隔的值。您想要計算每行中分號分隔值的數量。

PLSQL string functions可以幫助你在這裏,但你真的在談論編寫程序代碼來完成這項任務(這通常不是數據庫查詢語言的工作)。例如,你可以使用this trick計算分號的數量,然後添加一個:

LENGTH(name) - LENGTH(TRANSLATE(name,'x;','x')) + 1 

但@Johan被提出的觀點是,這是一個糟糕的方式來組織你的數據。例如,它使得無法正確查找名稱。您不能說where name == "smith",因爲名稱不等於"smith",它等於"smith;black;tiger"。你將不得不做一個子字符串搜索,說where name like "smith",這將是低效率和錯誤的。如果我要求查找「smi」這個名字怎麼辦?你會說where name like "smi"這將錯誤地找到結果 - 沒有辦法說「smith」在表中,但「smi」不是,因爲它們都是「smith; black; tiger」的子串。

一個更好的解決方案,如果你想要一個條目有多個名字,就是給這個條目一個唯一的ID;例如123.(您可以要求SQL自動爲表格行生成唯一的ID)。然後,爲映射回該行的名稱創建一個單獨的表。所以說,你給了「史密斯;黑色;老虎」行的ID 123和「X,Y」行的ID 124現在你將有另一個表NameMap有兩列:

name | entry 
------------------ 
smith | 123 
black | 123 
tiger | 123 
x  | 124 
y  | 124 

現在你可以看看在該表中創建名稱並使用連接將它們映射到名稱條目表上。

你就可以回答你的問題:「有多少名對應的條目表的每一行」與GROUP BY聲明是這樣的:

SELECT name, count(*) as value_count FROM NameMap GROUP BY name