2009-12-17 222 views
0

我有表中,在一個名爲測試的表中,其中有4個fields.one字段命名爲列表,我有1,2,3,4,5,6多個值用逗號分隔,我需要檢查是否在該表中,並在該特定領域的ID說4是否存在或通過SQL查詢。SQL查詢複雜

+3

這是什麼味道的SQL? –

+0

Django有一個名爲CommaSeparatedIntegerField的字段類型,我認爲它以文本形式存儲在數據庫中。我很難找到與這個東西的數據庫交互如何工作。 –

回答

-3

這個怎麼樣?

Select * From Foo Where Col like '%4%' 
+0

還是你需要看看是否有4',' – aaron

+3

,如果他有大於10 – Drevak

-1

如果你需要找到4只4(即不是14或24或40等),你應該使用

SELECT * FROM foo WHERE col LIKE '%, 4,%' 

SELECT * FROM foo WHERE col LIKE '%,4,%' 

如果有之間沒有空格逗號和數字

+0

,將不適用於「4,5,6」或只是「4」 – Thilo

+1

這將是行不通的這是真實的,但在這種情況下,我會編寫將字符串發送到數據庫的代碼,以便在開始和結束時包含逗號 - 或者在開始時使用空格,在結尾使用逗號並從查詢中移除第一個逗號 - 以便查詢將始終有效。 – AndrewDFrazier

4

你的數據庫設計是錯誤的,這就是爲什麼你有問題查詢數據。你應該把這些值放在一個單獨的表中,這樣教學價值就在它自己的領域。然後,它會很容易找到的記錄:

select t.testId 
from test t 
inner join listing l on l.testId = t.testId 
where l.id = 4 

現在你必須使用一些醜陋的字符串比較,找到記錄:

select testId 
from test 
where ','+listing+',' like '%,4,%' 
4

您可以嘗試

SELECT * 
FROM YourTable 
WHERE REPLACE(Col, ' ', '') LIKE '4,%' --Starts with 
OR REPLACE(Col, ' ', '') LIKE '%,4' --Ends with 
OR REPLACE(Col, ' ', '') LIKE '%,4,%' --Contains 
OR REPLACE(Col, ' ', '') = '4' --Equals 

正如感興趣的事,看看這個

DECLARE @delimiter NVARCHAR(5), 
     @Val INT 

SELECT @Val = 40 

SELECT @delimiter = ',' 

DECLARE @YourTable TABLE(
     ID INT, 
     Vals VARCHAR(50) 
) 

INSERT INTO @YourTable (ID,Vals) SELECT 1, '1,2,3,4,5,6,7,8' 

DECLARE @TempTable TABLE(
     ID INT, 
     Vals XML 
) 

INSERT INTO @TempTable 
SELECT ID, 
     CAST('<d>' + REPLACE(Vals, @delimiter, '</d><d>') + '</d>' AS XML) 
FROM @YourTable 

SELECT * 
FROM @TempTable tt 
WHERE EXISTS(
      SELECT T.split.value('.', 'nvarchar(max)') AS data 
      FROM tt.Vals.nodes('/d') T(split) 
      WHERE T.split.value('.', 'nvarchar(max)') = @Val 
) 
+0

然後你必須考慮逗號之間的空格,...。 +1雖然。 –

+0

假設確切的格式是固定的,您不必考慮逗號之間的空格。 – Thilo

+0

@Thilo:你是正確的偏見,但我不會指望它。 –

0

你可以在where子句和select子句中使用instring函數:

甲骨文:如果你想有一個單一值

select substr(column, instr(column, '1', 1), 1) 
where instr(column, '1', 1) > 0 

作品。可替換地可以使用的情況下或解碼語句的組合,以對於每個可能的值來創建單個列:

select 
decode(instr(column, '1', 1), 0, substr(column, instr(column, '1', 1), 1), null) c1, 
decode(instr(column, '2', 1), 0, substr(column, instr(column, '2', 1), 1), null) c2, 
decode(instr(column, '3', 1), 0, substr(column, instr(column, '3', 1), 1), null) c3 

這種方法對於這樣的歸一化差的數據集的優點是可以將此保存爲視圖和然後運行SQL,所以如果您保存上述內容,您可以使用:

select c1, c2 from view where c1 is not null or c2 is not null 

注意:在其他的dbms中,你可能必須使用不同的語法,可能是這種情況,而不是解碼語句