回答
因此,您希望對您的數據庫執行類似谷歌的免費文本搜索。這可以做,但表現將是Teh Suck! Google的速度很快,因爲它的索引有索引,重複數據存儲,並且通常會針對這種搜索進行優化。
無論如何,這裏是使用動態SQL和Oracle數據字典的概念證明。請注意,我將列限制爲要搜索的數據類型,即字符串。
SQL> set serveroutput on size unlimited
SQL> declare
2 dummy varchar2(1);
3 begin
4 for r in (select table_name, column_name from user_tab_cols
5 where data_type in ('VARCHAR2', 'CHAR', 'CLOB'))
6 loop
7 begin
8 execute immediate 'select null from '||r.table_name
9 ||' where '||r.column_name||' like ''%&search_value%'' '
10 ||' and rownum = 1'
11 into dummy;
12 dbms_output.put_line('Found it in >>>'
13 ||r.table_name||'.'||r.column_name);
14 exception
15 when others then
16 -- bad practice ahoy!
17 null;
18 end;
19 end loop;
20 end;
21/
Enter value for search_value: MAISIE
old 9: ||' where '||r.column_name||' like ''%&search_value%'' '
new 9: ||' where '||r.column_name||' like ''%MAISIE%'' '
Found it in >>>T23.NAME
PL/SQL procedure successfully completed.
SQL>
更健壯的實現可能需要處理的情況下,整個單詞等,如果你在10g或更高版本,然後正則表達式可能是有用的,但正則表達式相結合,動態SQL是一個,呃,有趣前景。
我再說一次,表現會是Teh Suck!在一個大型數據集上。調整幾乎是不可能的,因爲我們無法對每一列進行索引,當然也不支持LIKE或類似的模糊匹配。另一種方法是使用XQuery生成數據的XML表示,然後使用文本對其進行索引。維護這樣一個存儲庫將會是開銷,但是如果您需要定期使用這種功能,那麼這種努力將是一個合理的投資,尤其是在生產環境中。
SELECT * FROM table WHERE column='xxx';
但如果你有其中可以包含該值多少列,您需要使用OR:
SELECT * FROM table WHERE column1='xxx' or column2='xxx' or column3='xxx';
如果不能明確寫入了所有可能的列時,應使用模式產生dynamic SQL querymetadata。
select * from table_name where(Table_Attribute ='XXX');
這會告訴你這得到期望的結果與屬性XXX
sagar,你是什麼意思作爲TABLE_ATTRIBUTE? – sergionni 2010-07-20 08:43:18
那你列的像 student_id數據 – 2010-07-20 08:45:57
或類似Student_Name =「XXX」 – 2010-07-20 08:46:33
運行的所有記錄,使用SRY壞命名。
declare @_var nvarchar(1000)
declare @var1 nvarchar(1000)
declare @var2 nvarchar(1000)
declare _cur cursor
for select
case Column_name
when '' then ''
else Column_name+'=''asd'' OR '
end
from information_schema.columns
where table_name='M_Patient'
and
data_type ='nvarchar'
open _cur
fetch _cur into @_var
while(@@fetch_status=0)
begin
set @var2=isnull(@var2,'')[email protected]_var
fetch _cur into @_var
end
close _cur
deallocate _cur
set @var1='select * from M_Patient where '+ substring(@var2, 0,len(@var2)-2)
execute (@var1)
我通常使用這個腳本,如果我需要在數據庫中搜索一個值並且我不知道表和/或列。只需設置@SearcStr參數並按下播放即可。也許它可以幫助你。
DROP TABLE #Results
DECLARE @SearchStr nvarchar(100)
SET @SearchStr = ''
CREATE TABLE
#Results(ColumnName nvarchar(370), ColumnValue nvarchar(3630))
SET NOCOUNT ON
DECLARE @TableName nvarchar(256)
DECLARE @ColumnName nvarchar(128)
DECLARE @SearchStr2 nvarchar(110)
SET @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
WHILE @TableName IS NOT NULL
BEGIN
SET @ColumnName = ''
SET @TableName =
(
SELECT
MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0)
WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName =
(
SELECT
MIN(QUOTENAME(COLUMN_NAME))
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)
IF @ColumnName IS NOT NULL
BEGIN
INSERT INTO #Results
EXEC
(
'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)
FROM ' + @TableName + ' (NOLOCK) ' +
' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
)
END
END
END
SELECT
ColumnName
,ColumnValue
FROM
#Results
如果您需要這樣做一次或兩次,那麼APC的答案是好的。如果這在某種程度上(不寒而慄)是持續需求的一部分,那麼我認爲您可以做的最好的事情是在感興趣的表或表上創建一個Oracle計算字段並在其上進行搜索。使用您確定不會顯示在實際文本值中的分隔符,例如:
alter table mytable add search_column
as (mycolumn1||'^'||mycolumn2||'^'||mycolumn3);
現在您的查詢就會變成這樣的:
select <whatever transformation you want to see here>
from mytable where search_column like '%^xxx^%'
- 1. SQL選擇COUNT(值=值)可能嗎?
- 2. SQL:選擇特定的值輸出
- 3. 授予特定用戶擁有的所有表上的選擇
- 4. (SQL-T-SQL)選擇命令只有特定的值?
- 5. Python SQL選擇可能的NULL值
- 6. 是否有可能擁有CMYK顏色選擇器?
- 7. SQL選擇具有特定條件
- 8. 選擇特定日期SQL
- 9. 選擇沒有特定值的項目
- 10. TSQL有條件地選擇特定值
- 11. 選擇具有特定價值
- 12. 不具有特定的值選擇IDS
- 13. SQL集團擁有不超過2個不同的特定值
- 14. SQL - 如何選擇具有特定值的單詞在詞末
- 15. SQL - 僅選擇具有特定多個值的列
- 16. 在特定列中選擇具有最大值的行,SQL Server
- 17. Vue.js選擇特定值
- 18. MySQL選擇特定數量並計算所有可能的數
- 19. SQL選擇帶有功能
- 20. SQL - 選擇所有技能
- 21. R:選擇特定列具有特定值的矩陣的行
- 22. 是否有可能在Android中擁有「可選」權限?
- 23. JqGrid選擇可能或不可見的特定行
- 24. SQL選擇值
- 25. SQL選擇值
- 26. 擁有所有選擇節點/列表
- 27. SQL選擇沒有任何實體在特定列中具有值的條目
- 28. 指定sql列的特定值選項
- 29. SQL幫助,選擇特定列
- 30. 在SQL Server中選擇特定行
只是一個評論(您可能剛纔聽到的是科德在他的墳墓紡那聲音):儘量避免這種情況。 SQL不允許直接使用它(沒有特定的語法),即使有動態SQL的解決方法,健壯的數據庫應用程序應該保持簡單和愚蠢,而動態SQL隱藏了複雜性,這通常意味着遲早會出現問題(在意外功能條款,性能問題和/或安全問題)。 – Unreason 2010-07-20 09:19:07
您想要在數據庫管理系統中執行最基本的任務之一(即應用搜索條件返回結果集),但是您的模式阻止您這樣做。我會斷定你已經誤解了架構或架構是致命的缺陷。 – onedaywhen 2010-07-20 10:21:58
謝謝你的答案,我只是想補充說,這樣的選擇表達式我不會在應用程序中使用,它需要我定義以下映射:記錄從文件(輸入ASCII) - >從現有DB – sergionni 2010-07-20 12:50:14