SQL - 某个特定字符之前的所有内容;如果那里没有人物

时间:2016-06-29 16:15:52

标签: sql sql-server

我有一个数据集,我试图在逗号之前获取所有内容,或者在没有逗号的情况下获取数据。基本上我想要获得critera1。这是它的样子:

User1  criteria1,criteria2,criteria3 
User2  criteria1
User3  criteria1,criteria2

我已经尝试过这两个我找到了这个网站:

,LEFT([TURFS], CHARINDEX(',', [TURFS]) - 1) AS [TURF]
,REPLACE(LEFT(TURFS, CHARINDEX(',',TURFS)-1),',',' ')

但他们回来时出现错误,我猜测是因为我的某些数据行中没有逗号。

这是我得到的错误:
Msg 537,Level 16,State 2,Line 1
传递给LEFT或SUBSTRING函数的长度参数无效。

3 个答案:

答案 0 :(得分:2)

只需添加一个条件:

CASE WHEN CHARINDEX(',', [TURFS]) >0 then LEFT([TURFS], CHARINDEX(',', [TURFS]) - 1)
else
[TURFS] end as newValue

答案 1 :(得分:1)

以下是对import sys import io srcfile = sys.argv[1] with open(srcfile, 'rb') as f: fio = io.FileIO(f.fileno()) fbuf = io.BufferedReader(fio) print fbuf.read(20) 进行单次调用以获取结果的变体。如果找到逗号,则从第一个位置到逗号都包括但不包括逗号。如果没有逗号,则需要整个字段。

SUBSTRING

答案 2 :(得分:0)

这个怎么样?

DECLARE @tbl TABLE(UserName VARCHAR(100),Crit VARCHAR(100));
INSERT INTO @tbl VALUES
 ('User1','criteria1,criteria2,criteria3')
,('User2','criteria1')
,('User3','criteria1,criteria2');

WITH Splitted AS
(
    SELECT UserName
          ,CAST('<x>' + REPLACE(Crit,',','</x><x>') + '</x>' AS XML) AS CritSplitted  
    FROM @tbl   
)      
SELECT UserName 
      ,CritSplitted.value('/x[1]','nvarchar(max)') AS Crit1
      ,CritSplitted.value('/x[2]','nvarchar(max)') AS Crit2
      ,CritSplitted.value('/x[3]','nvarchar(max)') AS Crit3
FROM Splitted

结果

+-------+-----------+-----------+-----------+
| User1 | criteria1 | criteria2 | criteria3 |
+-------+-----------+-----------+-----------+
| User2 | criteria1 | NULL      | NULL      |
+-------+-----------+-----------+-----------+
| User3 | criteria1 | criteria2 | NULL      |
+-------+-----------+-----------+-----------+

注意

如果您的字符串可以包含三个邪恶字符,那么REPLACE<, > and &

应该{​​{1}}

更新

如果您只想要第一个值,可以将其减少为单行:

&lt; &gt; and &amp;