2016-10-21 64 views
0

我的表T中有一個TEXT列,並且包含一些由逗號分隔的值。作爲使用逗號在字符串中搜索特定值

B20,B30,B3,B13,B31,B14,B25,B29,B1,B2,B4,B5 
OR 
B1,B2,B34,B31,B8,B4,B5,B33,B30,B20,B3 

我想在我的查詢返回的結果只有B3存在


列BNFT具有文本值等。 它不應該考慮B30-B39或B [1-9] 3(即B13,B23 .... B93)。

我試着用下面的查詢,但是想要實現REGEXP或者REGEXP_LIKE/INSTR等。之前沒有用過它們,也無法理解。

Select * 
FROM T 
Where BNFT LIKE '%B3,%' or BNFT LIKE '%B3' 

請告知

程序將無法正常工作。查詢必須以選擇作爲第一條語句開始。

+0

只是要清楚。列中的單個單元格包含作爲字符串的'B20,B30,B3,B13,B31,B14,B25,B29,B1,B2,B4,B5'或這個b20與b30不同, –

+0

它是一個文本列,所有這些都在一個記錄中。它就像是用逗號分隔的多列值。 所以說客戶已經訂閱了所有的好處B1,B2,B7等...... –

+1

做你自己的一大好事:規範你的模式。 – Strawberry

回答

2

第一條建議是修復您的數據結構。將字符串存儲在字符串中是一個糟糕的主意:

  • 您正在將數字存儲爲字符串。這是錯誤的表示。
  • 您正在將多個值存儲在字符串列中。這不正確地使用SQL。
  • 這些值可能是ids。您無法聲明正確的外鍵關係。
  • SQL沒有特別強的字符串函數。
  • 生成的查詢無法利用索引。

也就是說,有時候我們會被其他人的糟糕設計決定所困住。

在SQL Server中,你會怎麼做:

where ',' + BNFT + ',' LIKE '%,33,%' 

這個問題最初被標記的MySQL,這對於這一目的提供find_in_set()

Where find_in_set(33, BNFT) > 0 
+0

我已經試過這個,但得到這個錯誤-----'find_in_set'不是一個公認的內置函數名稱..我使用ExactTarget,它支持SQL 2005我猜測 –

+0

另外,它已經建成的數據庫。所以不能改變。我只是詢問爲客戶獲取數據:) –

+0

@PankajGupta。 。 。這個問題最初是標記爲MySQL,因此你有一個MySQL的答案。我更新了答案。 –

0
Select * 
FROM T 
Where ',' + BNFT + ',' LIKE '%,B3,%'; 

Select * 
FROM T 
Where CHARINDEX (',B3,',',' + BNFT + ',') > 0; 
0
This can be easily achieve by CTE, REGEXP/REGEXP_Like/INSTR works better with oracle, for MS SQL Server you can try this 

DECLARE @CSV VARCHAR(100)='B2,B34,B31,B8,B4,B5,B33,B30,B20,B3'; SET @CSV = @ CSV +',';

WITH CTE

AS ( SELECT SUBSTRING(@ CSV,1,CHARINDEX( ' '@ CSV,1)-1)AS VAL,SUBSTRING(@ CSV,CHARINDEX(',',@ CSV,1 )+ 1,LEN(@CSV))AS REM UNION ALL SELECT SUBSTRING(A.REM,1,CHARINDEX(',',A.REM,1)-1)AS VAL,SUBSTRING(A.REM,CHARINDEX (',',A.REM,1)+ 1,LEN(A.REM)) 從CTE A WHERE LEN(A。REM)> = 1 )SELECT VAL from CTE VAL ='B3'

相關問題