如何在不知道列名的情况下进行SQL搜索?

时间:2014-03-28 02:16:52

标签: c# sql-server

您好我有一张表,其中包含产品属性名称和产品属性值。

有点像这样:

PAName1 PAValue1 PAName2 PAValue2 PAName3 PAName3 PAName4 PAName5

Height 6ft       Length  186cm    Weight   74kg   Name     John
Length 190cm     Height  6ft      Weight   83kg   Name     Mathew
Weight 55Kg      Length  186cm    Height   5.5ft  Name     Anthony
Name   Peter     Length  186cm    Weight   74kg   Height   6ft

如何选择高度为6英尺的行?

我知道如何使用In命令我可以选择所有PA来找到它,但我正在寻找更好的解决方案,

只想编辑我目前处理数百万行的内容,其中某些行具有不同的产品属性。例如,某些行没有Height作为值,它们可能具有Country。某些行没有任何名称。这阻止我用新的列名创建一个新表,因为我无法控制数据输入..

3 个答案:

答案 0 :(得分:1)

您可以从简单的

开始
SELECT * FROM table
WHERE (PAName1 = 'Height' AND PAValue1 = '6ft')
  OR (PAName2 = 'Height' AND PAValue2 = '6ft')
  ...
  OR (PAName5 = 'Height' AND PAValue5 = '6ft')

但更好的方法是将这些值存储在相应的列中。尝试重新设计您的表格:

CREATE TABLE Persons
(
  Id     uniqueIdentifier,  
  Name   varchar(255),
  Height float,
  Length float,
  Weight float
);

答案 1 :(得分:0)

有点不清楚(至少对我而言)你的产品名称,属性和价值如何联系在一起。我怀疑你的样本数据遗漏了产品名称。如果是这样,我会将其创建为Entity-Attribute-Value table

尝试类似:

CREATE TABLE dbo.product_attributes
(
    product_name VARCHAR(10) NOT NULL,
    attribute VARCHAR(255) NOT NULL,
    value VARCHAR(255) NULL
)

然后您可以像SELECT * FROM dbo.product_attributes WHERE attribute = 'Height' AND value = '6ft'

一样查询它

答案 2 :(得分:-1)

好的,我没有测试,但尝试以下

修改

;with p AS
(
    SELECT COLUMN1,COLUMN2,LEFT(Height, len(Height)-2)  AS HeightValue FROM YourTable 
 )
select * FROM p WHERE p.HeightValue ='6'   

注意

len(Height)-2  to exclude the ft from the height value