2016-09-16 24 views
-3

比較假設我有一個表,結果複雜文本在SQL

--------------------------------------------------------- 
coupon id| required_product_ids|used_product_in_this_year 
--------------------------------------------------------- 
1  |1,2,3,10    |2,3,4,5,6,7,8,9,10,12,13 

我如何檢查是否有used_product_in_this_year通過SQL至少一個required_product_ids。 我嘗試了一些像SQL一樣的關鍵字,但沒有成功。

+1

這是一個糟糕的桌子設計。爲產品更好地插入單獨的行。這隻會造成複雜性。使用計算列。 –

+0

第2章比爾卡爾文出色的着作「SQL反模式:避免數據庫編程陷阱」的「Jaywalking」很好地涵蓋了這個話題。 https://www.amazon.com/SQL-Apatpatterns-Programming-Pragmatic-Programmers/dp/1934356557 – spencer7593

+0

初學者設計我猜.. –

回答

0

沒有用於執行此類型比較的本機SQL構造。

要在逗號分隔列表中查找單個值,MySQL提供了FIND_IN_SET函數。但是,要處理逗號分隔的值列表,要檢查每個值,看看它是否在列表中,則需要將每個單獨的值提供給FIND_IN_SET。而這將是不起眼的。

如果硬性和快速的要求是在SQL語句中處理這種比較,我建議編寫一個函數來進行比較。

DELIMITER $$ 

CREATE FUNCTION upity_halo_rpi(upity VARCHAR(4000), rpi VARCHAR(4000)) 
RETURNS INT DETERMINISTIC 
BEGIN 
    -- TODO: extract first element of upity 
    -- TODO: check if element is in rpi list 
    -- if it is found in the list 
     RETURN TRUE; 
    -- otherwise, split off next element 
    -- loop through all elements 
    -- if loop completes without finding a match is found, fall out 
     RETURN FALSE; 
END$$ 

DELIMITER ; 

通過編寫並經過徹底測試的函數,它可以在SQL語句中使用。要返回列表示該行「至少有一個」 ...

SELECT t.coupon id 
     , t.required_product_ids 
     , t.used_product_in_this_year 
     , upity_halo_rpi(t.used_product_in_this_year,t.required_product_ids) AS halo 
    FROM result t 

返回:

coupon id required_product_ids used_product_in_this_year halo 
--------- -------------------- ------------------------ ----- 
1   1,2,3,10    2,3,4,5,6,7,8,9,10,12,13  1 

我不會寫的功能。我只是在展示一種可能的方法。在SQL語句中可以執行這種類型的比較操作的「如何」的一個可能的答案。

+0

謝謝你的回答,我會試試這個。 –

+0

經過測試!有效。謝謝 –

0

這就是你如何做到的,而不需要改變你的數據庫結構。

在MySQL(測試):

select * from TableName 
    where concat(',', used_product_in_this_year, ',') regexp concat(',',replace(required_product_ids,',',',|,'),',') 

使用該正則表達式結構與表和操作與一些MySQL的字符串的函數的數據。

我不推薦你的數據庫結構,但我喜歡拼圖,這個很有趣,感謝挑戰。

+0

對不起offtop,但如果你真的很喜歡sql謎題檢查sql-ex.com – Sergey

+0

謝謝你。對我缺乏信息。我使用mssql而不是mysql。但感謝您的回答,我會用mssql來試試這個。 –

+0

您將問題標記爲'mysql',所以我認爲它是。我不確定你如何在mssql中做到這一點。我不使用該數據庫:( – Henry