将varchar子字符串中的ID值转换为其查找值

时间:2017-06-30 04:54:19

标签: sql sql-server sql-server-2008


我有一个varchar类型的SQL列,用于包含SQL条件,例如(下面3行):

WHERE Language = 1 OR Region = 10
WHERE Color= 3 OR Region = 10
WHERE Status = 1 OR Region = 10 AND Language = 1

我需要创建一个查询来获取可以发送给任何非技术人员的查找值。输出将是:

WHERE Language = English OR Region = Canada
WHERE Color= Red OR Region = Canada
WHERE Status = Active OR Region = Canada AND Language = English

我知道我可以先将所有查找放在临时表中然后使用REPLACE函数,但我想知道是否有更好(和更短)的方法来执行此操作?任何帮助都会得到满足。
感谢。

1 个答案:

答案 0 :(得分:0)

我会创建子查询列值,准备替换原始文件,f.eks为Regions:

SELECT 
  CONCAT('%Region = ', Region,'%') ConditionToJoin,
  CONCAT('Region = ', Region) ConditionToFind, 
  CONCAT('Region = ', RegionName) ConditionToReplace
FROM Regions

使用LIKE运算符和ConditionToJoin列连接此子查询和条件行。

如果您需要处理以下情况,还有一个问题:

  • 地区= 1
  • 地区= 1 等...

或者,您可以编写用户函数来清洗数据并执行所有替换,例如:

CREATE FUNCTION replaceLookups(@condition VARCHAR(MAX))
RETURNS VARCHAR(MAX)
BEGIN
  @string_replacement VARCHAR(MAX), @string_pattern VARCHAR(MAX);

  SET @string_pattern = SELECT TOP 1 CONCAT('Region = ', Region) FROM Regions WHERE @condition LIKE CONCAT('%Region = ', Region, '%')

  SET @string_replacement = SELECT TOP 1 CONCAT('Region = ', RegionName) FROM Regions WHERE @condition LIKE CONCAT('%Region = ', Region, '%')

  SET @ret = REPLACE(@condition, @string_pattern, @string_replacement)
  ... --and so on for each lookup
  RETURN @ret
END

警告的话。上面的代码是从头顶写的 - 可能需要一些工作。我也不会期待出色的表现。