【问题标题】:Search for a particular value in a string with commas用逗号在字符串中搜索特定值
【发布时间】:2016-10-21 09:31:28
【问题描述】:

我的表 T 中有一个 TEXT 列,其中包含一些用逗号分隔的值。

示例
列 BNFT 具有文本值,例如

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 存在时在我的查询中返回结果。 它不应考虑 B30-B39 或 B[1-9]3(即 B13、B23 .... B93)。

我尝试了以下查询,但想实现 REGEXP 或 REGEXP_LIKE/INSTR 等。以前没有使用过,也无法理解。

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

请多多指教

程序将不起作用。查询必须以 Select as 1st 语句开头。

【问题讨论】:

  • 只是为了清楚。列中的单个单元格包含 'B20,B30,B3,B13,B31,B14,B25,B29,B1,B2,B4,B5' 作为字符串,或者这个 b20 是不同于 b30 的单元格?
  • 它是一个文本列,所有这些都在一个记录中。它就像该列的多个值,用逗号分隔。所以说客户已订阅所有福利 B1、B2、B7 等......
  • 帮自己一个大忙:规范化你的架构。
  • 它已经建立的数据库。所以无法更改。我只是在查询为客户获取数据:) –

标签: sql regex sql-server-2005


【解决方案1】:

第一个建议是修复您的数据结构。在字符串中存储 id 列表是个坏主意:

  • 您将数字存储为字符串。那是错误的表示。
  • 您正在一个字符串列中存储多个值。那是没有正确使用 SQL。
  • 这些值可能是 id。您不能声明正确的外键关系。
  • SQL 没有特别强大的字符串函数。
  • 生成的查询无法利用索引。

也就是说,有时我们会被其他人的错误设计决策所困扰。

在 SQL Server 中,您会这样做:

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

这个问题最初被标记为 MySQL,它为此提供了find_in_set()

Where find_in_set(33, BNFT) > 0

【讨论】:

  • 我已经尝试过了,但是得到了这个错误 ----- 'find_in_set' 不是一个公认的内置函数名。我正在使用 ExactTarget,我猜它支持 SQL 2005
  • 另外,它已经建立了数据库。所以无法更改。我只是在查询以获取客户的数据:)
  • @PankajGupta 。 . .该问题最初被标记为 MySQL,因此您得到了 MySQL 答案。我更新了答案。
【解决方案2】:
Select *
FROM T
Where ',' + BNFT + ',' LIKE '%,B3,%';

Select *
FROM T
Where CHARINDEX  (',B3,',',' + BNFT + ',') > 0;

【讨论】:

    【解决方案3】:
    This can be easily achieve by CTE, REGEXP/REGEXP_Like/INSTR works better with oracle, for MS SQL Server you can try this
    

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

    与 CTE 作为 ( 选择 SUBSTRING(@CSV,1,CHARINDEX(',',@CSV,1)-1) 作为 VAL,SUBSTRING(@CSV,CHARINDEX(',',@CSV,1)+1,LEN(@CSV))作为 REM 联合所有 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 ) 从 CTE 中选择 VAL WHERE VAL='B3'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 2021-12-02
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多