【问题标题】:Efficient iteration means in SQL server, to retrieve data after certain operation on each row高效迭代是指在 SQL Server 中,对每一行进行一定操作后检索数据
【发布时间】:2019-11-28 06:36:28
【问题描述】:

我有一个简单的表格,即

  • ID 整数,
  • 值 varchar(100)

value 列由分隔字符串组成,例如


- ID - 值

  • 1 - a,b,c,d
  • 2 - b,e
  • 3-c
  • 4 - r

在根据分隔符拆分每个值后,我需要从中检索所有值,即“。”

我有一个用户定义的函数来分割字符串。 什么是正确/有效的方法?我希望避免遍历每一行,然后拆分字符串。

【问题讨论】:

  • 你的预期输出是什么?
  • @RedDevil a b c d e r - 拆分值后分隔字符串中的每个不同 val
  • 到目前为止您尝试过什么?请通过minimal-reproducible-example 发帖尝试。
  • 解决这个问题的正确和有效的方法是规范你错误的数据库结构 - 并停止将分隔字符串存储为列值。欲了解更多信息,请阅读Is storing a delimited list in a database column really that bad?,您会在其中看到很多理由说明为什么这个问题的答案是绝对是的!
  • 你使用的是哪个 sql 版本?

标签: sql sql-server sql-server-2012


【解决方案1】:

使用交叉应用可以检索所有行。 (假设 dbo.Split_fun 是您的拆分函数,值是返回列名)

DROP TABLE IF EXISTS #CityList
GO

CREATE TABLE #CityList
(Country VARCHAR(100),
City VARCHAR(5000))
GO

DROP TABLE IF EXISTS #contacts;
CREATE TABLE #contacts (
    id INT PRIMARY KEY IDENTITY,
    first_name VARCHAR(100) NOT NULL,
    last_name VARCHAR(100) NOT NULL,
    phones VARCHAR(500)
);

INSERT INTO 
    #contacts(first_name, last_name, phones)
VALUES
    ('John','Doe','(408)-123-3456,(408)-123-3457'),
    ('Jane','Doe','(408)-987-4321,(408)-987-4322,(408)-987-4323');


    SELECT id,
    first_name, 
    last_name,
    value phone
FROM 
    #contacts
    CROSS APPLY dbo.Split_fun(phones, ',');

【讨论】:

  • 哇!这看起来完全符合我的期望,任何关于 CROSS APPLY 效率的 cmets,我都在浏览这个。
【解决方案2】:

请使用以下查询进行详细了解。

USE [Your Database]
--create a table 'xc' to insert the data--
CREATE TABLE xc
(
Id INT,
[value] VARCHAR(100)
)
--Insert the data into table xc--
INSERT INTO dbo.xc
VALUES (1,'a,b,c,d')
(2,'b,e'),(3,'c'),(4,'r')

--Now run Update statement to get records a '.'(dot) delimited
UPDATE dbo.xc SET [value]=Replace([value],',','.')
--Now See the data---
Select * from dbo.xc

请同时检查快照。

【讨论】:

    猜你喜欢
    • 2020-09-07
    • 2015-05-13
    • 1970-01-01
    • 2011-10-13
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    相关资源
    最近更新 更多